使用来自delphi dll的回调和c ++

时间:2016-09-01 20:08:33

标签: c++ delphi dll callback function-pointers

我必须使用delphi dll提供一些回调程序。如果我将它们与C#一起使用,一切正常。如果我使用C ++,则回调不起作用。 在delphi dll中,回调编写如下:

procedure addConnectionCallBack(connectCallback: TConnectCallback);    StdCall;
begin
  initMyConnection();
  if assigned(MyConnection) then
  begin
    MyConnection.addConnectionCallBack(connectCallback);
  end;
end;

使用C#时一切正常:

// make delegate
public delegate void ConnectionCallBack();

// define dll
[DllImport(_dll_name, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern void addConnectionCallBack(ConnectionCallBack ccb);

// function with signature of ConnectionCallBack
private void showConnected() {
    Console.WriteLine("connected");
}

// address callback to dll  
public void start() {
    addConnectionCallBack(showConnected);
}   

在C ++中我无法解决它:

typedef void (__stdcall *ConnectionCallBack)();
typedef void (__stdcall *addConnectionCallBack)(ConnectionCallBack);

addConnectionCallBack _addConnectionCallBack;

// !!! this should be called from delphi dll, but isn't !!!
void __stdcall showConnected() {
    std::cout << "connected" << std::endl;
}
//auto showConnected = []()->void {std::cout << "connected" << std::endl; };

int main()
{
    LPCWSTR _dll_name = L"MyDelphi.dll";
    HINSTANCE _hModule = NULL;  
    _hModule = LoadLibrary( _dll_name);
    assert(_hModule != NULL);

    _addConnectionCallBack = (addConnectionCallBack) GetProcAddress(_hModule, "addConnectionCallBack");

    ConnectionCallBack conn = showConnected;
    _addConnectionCallBack(conn);

    // do some other dll calls which work and force the callback.   

    FreeLibrary(_hModule);
    return 0;
}

对返回字符串的dll的其他调用正在运行。尝试以各种方式使用函数指针或std::function / std::bind但没有运气。

请有人检查我的C ++代码并给我一个提示!我不再有任何想法了。

1 个答案:

答案 0 :(得分:0)

我通过使用Visual Studion Win32项目模板解决了这个问题,或者更确切地说将C ++主函数修改为:

int CALLBACK WinMain( In HINSTANCE hInstance, In HINSTANCE hPrevInstance, In LPSTR lpCmdLine, In int nCmdShow) {}

这使dll的进程保持活跃状态​​。

感谢您的帮助。