Delphi и C ++, импорт DLL - PullRequest
       17

Delphi и C ++, импорт DLL

0 голосов
/ 30 марта 2012

У меня есть DLL с экспортированной функцией:

int HCalculator::CalculateMC(const char* h, const char* b, const char* d, __int64 numberOfTrials, double* results) 

Как импортировать эту функцию в проект Delphi?

Похоже, что:

function CalculateMC(h, b, d: PChar; numberOfTrials: int64; results: ???): integer; stdcall; external 'MYDLL.DLL'; 

А как насчет массива double?Как записать это?И как мне вызвать эту функцию?

1 Ответ

1 голос
/ 30 марта 2012

Параметр results представляет собой массив значений типа double.Предположим, что в массиве есть numberOfTrials элементов.Затем вы бы назвали DLL следующим образом:

function CalculateMC(h, b, d: PChar; numberOfTrials: int64; 
    results: PDouble): integer; stdcall; external 'MYDLL.DLL';
.....
var
  returnVal: integer;
  results: array of Double;
.....
SetLength(results, numberOfTrials);
returnVal := CalculateMC(h, b, d, numberOfTrials, @results[0]);

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

Другая возможная проблема заключается в том, что вы указали stdcall в своем импорте Delphi, но не сделали этого в коде C ++.Если вы компилируете C ++ с возможностью использовать stdcall для своих функций, то интерфейсы будут совпадать.В противном случае вы вообще не сможете вызвать этот код из Delphi, потому что MS thiscall не имеет прямого эквивалента в Delphi.Я бы добавил явный __stdcall к вашему коду C ++.

...