【发布时间】:2016-09-01 20:08:32
【问题描述】:
我必须使用提供一些回调程序的 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++ 代码并给我一个提示!我已经没有任何想法了。
【问题讨论】:
-
如果我使用 C++,回调不起作用。 -- 请更详细地解释您所说的“不起作用”是什么意思。程序崩溃?其他一些函数被调用?没有函数被调用?
-
在 c++ 解决方案中,函数 showConnected() 永远不会被调用。在 C# 中它得到了。
-
所以现在的问题是:Delphi 代码在做什么?该回调的值是多少? C++ 代码可能没有被调用,因为 Delphi 没有调用它。
if Assigned(connectedCallback) then——如果这个结果是false呢? -
我对delphi不熟悉。所以对我来说更好的问题是,是什么让 C# 代码与 C++ 代码如此不同?因为使用 C# 它可以工作。
-
C# != C++。这就是为什么你必须查看中间人,即 Delphi 代码,以了解它实际做了什么。
标签: c++ delphi dll callback function-pointers