19.09.2012 22:24
NeferSky
 
Подскажите, люди добрые. Пытаюсь использовать драйвер весов от Mettler Toledo. Представляет из себя кучку библиотек, из одной из которых вызывается нужная мне функция (цитата из документации):
Код:
ireturn = Transfer_Ethernet_EX(“Transscale.ini”,251245664)
В реале вызвать ее получилось лишь по имени _Transfer_Ethernet_EX@8, ну да не в этом даже дело. Нашел пример использования этой функции на Си++, подключение и вызов выглядят так:
Код:
extern "C" __declspec(dllimport) unsigned __stdcall Transfer_Ethernet_EX(char *cTrfTxtout , int key);
Код:
 unsigned iback=Transfer_Ethernet_EX("Transscale.ini",251245664);
Сам я в Си не силен, но так понимаю, что "char *cTrfTxtout" - это указатель на что-то типа Char. В Делфи подключаю функцию:
Код:
type
  Transfer_Ethernet_EX = procedure(cTrfTxtout: ^PChar; Key: integer);

var
  DLLInstance: THandle;
  TransferProc: Transfer_Ethernet_EX;

begin
  DLLInstance := LoadLibrary('TransferEth.dll');
  @TransferProc := GetProcAddress(DLLInstance, '_Transfer_Ethernet_EX@8');
  if @TransferProc <> nil then TransferProc('Transscale.ini', 251245664);
  FreeLibrary(DLLInstance);
end;
Ругается, что Identifier expected, but '^' found на объявление в type. Так как мне там указатель применить? Интерпретируйте, пожалуйста, с Сей на Паскаль, если не затруднит...
20.09.2012 08:07
OlegON
 
Паскаль и Delphi - разные вещи. Я в Delphi уже давно не был. Но...
PChar - это и есть указатель. ^ там вообще никуда. И вообще, если объявлять, то ^ пишется впереди, т.е. PAnsiString = ^AnsiString
Остальное не смотрел, говори, если на что-то ругается, хотя, мне кажется, ты куда-то не туда побрел.
20.09.2012 09:02
NeferSky
 
Гм. А без ^ MT'шный драйвер говорит "ошибка откр. файла C:\Work\Delphi\Scale\PbB".
C:\Work\Delphi\Scale\ - это папка с проектом, а что такое PbB - мне невдомек. Выходит, функция вместо адреса файла подцепляет строку с именем?
20.09.2012 09:58
OlegON
 
А с чего ты взял, что _Transfer_Ethernet_EX@8 и Transfer_Ethernet_EX - это одно и то же? Думается, что ты просто не ту функцию вызываешь.
20.09.2012 12:09
NeferSky
 
В библиотеке в принципе есть только две функции:
unsigned iback=Transfer_Ethernet("Transscale.ini");
и
unsigned iback=Transfer_Ethernet_EX("Transscale.ini",251245664);

Меня интересует последняя. По имени "Transfer_Ethernet_EX" вообще ничего импортировать не получается (@TransferProc остается со значением nil). А подчерк, собачка и "8" в имени функции - я так понимаю, name mangling, результат работы Си при компиляции библиотеки.
20.09.2012 12:21
OlegON
 
странное name mangling, никогда не слышал, чтобы имена кромсались.
прогони какой-нибудь tdump или dumpbin, чтобы посмотреть, что в секции exports
20.09.2012 13:17
NeferSky
 
Turbo Dump Version 5.0.16.12 Copyright (c) 1988, 2000 Inprise Corporation
Display of File C:\TRANSFERETH.DLL
EXPORT ord:0001='Transfer_Ethernet'
EXPORT ord:0002='_Transfer_Ethernet_EX@8'

В общем, да, действительно с подчерком и собака-восемь, все честно...
Dumpbin'ом не располагаю...
20.09.2012 15:14
NeferSky
 
Решил проблему. Заработало вот так:
Код:
type
  Transfer_Ethernet_EX = procedure(cTrfTxtout: PChar; Key: integer); stdcall;
22.09.2012 17:52
NeferSky
 
Ого, как. Спасибо, будет полезно.
Часовой пояс GMT +3, время: 19:28.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.