Здравствуйте уважаемые участники форума. Кто-нибудь из вас пытался перевести с C++ на Delphi пример DLL сложения двух чисел? Третий день бьюсь. Пишу так: … library FBD1; … type PDO_DEFAULT = ^DO_DEFAULT; DO_DEFAULT = packed record q_in:integer; q_out:integer; q_int:integer; nftype:integer; name:array[0..7] of char; fname:array[0..7] of char; end; … procedure zFBD_DLL_info(buf:Pointer); var dd:PDO_DEFAULT; begin dd:=buf; //Получаю buf =$1B00, приводим к типу //PDO_DEFAULT dd^.q_in:=3;// Вот тут получаю:access //violation at //0x01d08bfc:write //of address 0x00001b00 dd^.q_out:=1; dd^.q_int:=0; dd^.nftype:=17; dd^.name:='fbd0'; dd^.fname:='fbd0'; end; … exports zFBD_DLL_info … end.
Буду рад если кто-нибудь прокомментирует это со знанием дела.
Posted by Черемнов Дмитрий (Участник № / Member № 721) on :
В интерфейсе для FBD-dll применяется иной тип вызова функций - MSVisualC++ (не Borland'a). Опишите FBD-dll на MSVisualC++, функциональность задавайте в библиотеках Delphi, C++Buider'e, из fbd.dll обьявите вызовы требуемых функций, //--------------- //FBD0.CPP, //импорт extern "C" float __fastcall Summa(int,int);
//--------------- //Ваша библиотека (C++Buider) //export в fbd#.dll extern "C" float __msfastcall __export Summa(unsigned short,unsigned short);
Posted by ilya (Участник № / Member № 469) on :
Здравствуйте Дмитрий. Большое спасибо за ответ. То что Вы предлагаете, конечно тоже вариант. Но мне все таки удалось перевести пример с C++ на Delphi напрямую, не используя промежуточное звено. Приведенный мною код правильный, а все дело в том, что функции моей библиотеки на Delphi вызывались не в том порядке После того как секция exports библиотеки на Delphi была переписана следующим образом: exports FBD_DLL index 1 name 'FBD_DLL', zFBD_DLL_info index 2 name 'zFBD_DLL_info', zFBD_DLL_varname index 3 name 'zFBD_DLL_varname'; end. Да, и конечно же, все экспортируемые функции должны иметь директиву cdecl.
Кстати у Вас есть опыт разработки ActiveX компонентов на Delphi для Trace Mode?