Вызов C ++ DLL в приложении Delphi - PullRequest
2 голосов
/ 21 октября 2011

Я хочу вызвать функцию C ++ DLL в моем приложении Delphi.
Проблема в том, что я получил нарушение прав доступа.Но не при вызове моей C ++ DLL, а при выходе из функции Delphi, в которой я это делаю.

Сообщение об ошибке (сокращено):
Нарушение доступа в 0x7445c9f1: чтение по адресу 0x00000000.

Мой метод C ++ выглядит так:

extern "C" __stdcall void SetName(LPCTSTR name) {strcpy_s(nameInDll,512,name);};

Мой вызов Delphi выглядит следующим образом:

begin   
   ...
   hDll := LoadLibrary('myCpp.dll');
   SetName := getprocaddress(hDll, 'SetName');
   SetName(pchar(myControl.text));  //  <--- exception NOT here
   ...
end;  // <--- exception here

забавно то, что он работает, если я использую усерднозакодированный текст в качестве ввода для вызова DLL выглядит следующим образом:

SetName(pchar('myName'));

РЕДАКТИРОВАТЬ:
Я пропустил определение __ stdcall в моемC ++ DLL.Это было определено в макросе.Я исправил приведенное выше определение метода C ++.

Увидев это и ваши советы, я нашел решение, которое работает:

procedure SetName(s: PChar); stdcall; external 'myCpp.dll';

begin   
   ...
   SetName(pchar(myControl.text));
   ...
end;

Ответы [ 3 ]

7 голосов
/ 21 октября 2011

Похоже, SetName использует неправильное соглашение о вызовах, попробуйте использовать cdecl;

Примерно так:

var
  SetName : procedure(nameArg: PChar); cdecl;

В противном случае ваш стек будет испорчен.

0 голосов
/ 22 октября 2011

DLL скомпилирована для Ansi или Unicode? LPCTSTR отображается на wchar_t*, если определено UNICODE, или на char* в противном случае. Это влияет на то, как вы используете DLL в Delphi, где wchar_t* эквивалентно PWideChar и char* эквивалентно PAnsiChar в Delphi.

0 голосов
/ 21 октября 2011

в зависимости от тяжести вашей работы, в опциях компилятора вам может потребоваться установить:

minimum enum size:  double word
record field alignment:  quad word
...