[ОТВЕТИТЬ]
Опции темы
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;
 
"Спасибо" NeferSky от:
22.09.2012 09:01  
OlegON
Вот, на всякий случай, пример вызова внешней библиотеки (тоже С)
 
22.09.2012 17:52  
NeferSky
Ого, как. Спасибо, будет полезно.
 
 


Опции темы



Часовой пояс GMT +3, время: 04:57.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.