我必须使用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 ++代码并给我一个提示!我不再有任何想法了。
答案 0 :(得分:0)
我通过使用Visual Studion Win32项目模板解决了这个问题,或者更确切地说将C ++主函数修改为:
int CALLBACK WinMain( In HINSTANCE hInstance, In HINSTANCE hPrevInstance, In LPSTR lpCmdLine, In int nCmdShow) {}
这使dll的进程保持活跃状态。
感谢您的帮助。