Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Экспорт функций из ДЛЛ


Автор: maxfox111 9.7.2013, 17:20
Добрый день, 
Хотелось бы получить консультацию по следующему вопросу:
Есть DLL (DLL_LIB.dll)у которой есть набор экспортируемых функций, правильно ли я объявляю их в модуле дельфи.
То есть есть список:
DLL_LIB void __stdcall  Set_Bit_R1(unsigned short int * );
-------------//-----------------//----------
DLL_LIB void __stdcall  Set_Bit_R24(unsigned short int * );
Я объявляю, у себя в исходнике, его как
Код

Procedure Set_Bit_R1 ( ii : short); stdcall; external DLL_LIB.dll';
-------------//-----------------//----------
Procedure Set_Bit_R24 ( ii : short); stdcall; external DLL_LIB.dll';

1)    У меня очень большое сомнение в том, что я правильно объявляю параметры. 
2)    В том случае, если я просто создаю такой список объявлений, то программа запускается и все нормально. В том случае если я хотя бы, какой вызов из этого списка пытаюсь осуществить, то выдается сообщение об ошибке
«The procedure entry point Set_Bit_R1 could not be located in the dynamic link library DLL_LIB.dll.»

Большая просьба (не бить сильно)  либо подскажите где возможно прочитать о правильной декларации экспортируемых функций, либо подскажите в чем я ошибаюсь.
Спасибо
 

Автор: Poseidon 9.7.2013, 17:48
На сколько я понимаю, тут передается 2 параметра: unsigned short и int *. unsigned short в си - это word в Delphi. int * в си - это, наверно, PInteger. Ну и при объявлении функции после слова external имя библиотеки должно передаваться как текст (т.е. в одинарных кавычках).

Автор: maxfox111 9.7.2013, 18:09
Уважаемый Посейдон

1)
К ДЛЛ прилагается описание функций и макросов
так для этого списка который привел я, там указано
макросы:
SET_BIT1(Data)
функции: 
Set_Bit1(unsigned short int *Data )

2)
К стыду своему сразу не обратил внимание, Я объявляю вот так, то есть с одинарными кавычками. Это правильно?  
Код

procedure Clr_Rm_Bit_E( ii : short); stdcall; external 'DLL_NT_PCI429.dll';


А в соответствии с вашими комментами надо 
Код

procedure Clr_Rm_Bit_E( ii : word); stdcall; external 'DLL_NT_PCI429.dll';


Автор: Illusion Dolphin 9.7.2013, 19:25
http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/CONCEPT/data_types.html
Т.е. это один параметр
Код

procedure Clr_Rm_Bit_X(ii: PWORD); stdcall; external 'DLL_NT_PCI429.dll';

Автор: maxfox111 10.7.2013, 09:37
Добрый день, еще раз
условие:
Есть DLL (DLL_LIB.dll)у которой есть набор экспортируемых функций
Код

DLL_LIB void __stdcall Set_Bit_R1(unsigned short int * );
-------------//-----------------//----------
DLL_LIB void __stdcall Set_Bit_R24(unsigned short int * );

Еще есть документ описывающий действия выполняемые этими функциями. Где функции описаны также.
Я объявляю, у себя в исходнике, его как
Код

Procedure Set_Bit_R1 ( ii : PWORD); stdcall; external ‘DLL_LIB.dll’;
-------------//-----------------//----------
Procedure Set_Bit_R24 ( ii : PWORD); stdcall; external ‘DLL_LIB.dll';

Без вызова этих процедур, моя программа компилируется нормально. НО стоит добавить вызов любой процедуры, выскакивает сообщение об ошибке
«The procedure entry point Set_Bit_R1 could not be located in the dynamic link library DLL_LIB.dll.» Посмотрел в тотал командере при помощи плагина FileInfo со снятой галкой "Undecorate", список имен необходимых мне функций выглядит так:
Код

?Set_Bit_R21@@YGXPAG@Z
?Set_Bit_R24@@YGXPAG@Z

Такие имена в декларации не поддерживает уже среда Дельфи. Пересобирать ДЛЛ я не могу, так как не имею ее исходного кода.

Вопрос:
Как из своей программы получить возможность осуществить вызов функций из этой ДЛЛ?
Большое спасибо

Автор: Fomoco 10.7.2013, 11:49
Попробуй так

Код

procedure Set_Bit_R1 ( ii : PWORD); stdcall; external 'DLL_LIB.dll' name '?Set_Bit_R21@@YGXPAG@Z';
procedure Set_Bit_R24 ( ii : PWORD); stdcall; external 'DLL_LIB.dll' name '?Set_Bit_R24@@YGXPAG@Z';

Автор: Poseidon 10.7.2013, 12:19
maxfox111, я думаю, что если хочешь действительно получить ответ, то придется показать тот самый документ, который идет в сопровождение к этой длл, иначе мы тут на кофейной гуще гадаем.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)