2012-06-20 4 views
4

У меня есть C++ DLL, которую я написал, которая имеет одну открытую функцию, которая принимает указатель функции (функцию обратного вызова) в качестве параметра.Вызов функции обратного вызова в Delphi из C++ DLL

#define DllExport extern "C" __declspec(dllexport) 

DllExport bool RegisterCallbackGetProperty(bool (*GetProperty)(UINT object_type, UINT object_instnace, UINT property_identifer, UINT device_identifier, float * value)) { 
    // Do something. 
} 

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

У меня есть Delphi application calling a simple exposed c++ DLL functions с помощью, которую я получил в этом вопросе.

Я строю C++ DLL, и я могу изменить его параметры, если это необходимо.

Мои вопросы:

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

ответ

11

Объявление функции в Delphi путем объявления типа функции. Например, тип функции для обратного вызова может быть определена следующим образом:

type 
    TGetProperty = function(object_type, object_instnace, property_identifier, device_identifier: UInt; value: PSingle): Boolean; cdecl; 

Обратите внимание на соглашение о вызове является cdecl, потому что ваш C++ код не указано не соглашение о вызовах и Cdecl умолчанию обычно используется соглашение о вызове для компиляторов C++.

Затем вы можете использовать этот тип для определения функции DLL:

function RegisterCallbackGetProperty(GetProperty: TGetProperty): Boolean; cdecl; external 'dllname'; 

Replace 'dllname' с именем вашей DLL.

Чтобы вызвать функцию DLL, вы должны сначала иметь функцию Delphi с сигнатурой, которая соответствует типу обратного вызова. Например:

function Callback(object_type, object_instnace, property_identifier, device_identifier: UInt; value: PSingle): Boolean cdecl; 
begin 
    Result := False; 
end; 

Тогда вы можете вызвать функцию DLL и передать функцию обратного вызова так же, как и любой другой переменной:

RegisterCallbackGetProperty(Callback); 
Смежные вопросы