我在 C ++中有一个回调(static void __stdcall)。我希望另一个程序将其注册(通过传递func ptr),然后在DLL中调用calback。到目前为止我没有运气。但是,如果它在常规C ++程序中,则相同的回调可以工作。我现在想知道是否有可能在DLL中进行回调。任何帮助将不胜感激!
感谢。
添加一些代码:
C#app:
[DllImport("DLLfilename.dll")]
public static extern void DLL_SetCallback(CallbackDelegate pfn);
public delegate void CallbackDelegate();
//setDelegate() is called in init() of the C# app
public void setDelegate()
{
CallbackDelegate CallbackDelegateInstance = new CallbackDelegate(callback);
DLL_SetCallback(CallbackDelegateInstance);
}
public void callback()
{
//This is the function which will be called by the DLL
MessageBox.Show("Called from the DLL..");
}
C DLL: //链接到externalLibrary.lib
#include "externalLibrary.h"
typedef void (__stdcall CallbackFunc)(void);
CallbackFunc* func; //global in DLL
//Exported
extern "C" __declspec(dllexport) void DLL_SetCallback(CallbackFunc* funcptr)
{
//setting the function pointer
func = funcptr;
return;
}
//Exported
extern "C" __declspec(dllexport) void RegisterEventHandler(Target, Stream,&ProcessEvent , NULL)
{
//ProcessEvent is func to be caled by 3rd party callback
//Call third-party function to register &ProcessEvent func-ptr (succeeds)
...
return;
}
//This is the function which never gets called from the 3rd party callback
//But gets called when all the code in the DLL is moved to a standard C program.
void __stdcall ProcessEvent (params..)
{
//Do some work..
func(); //Call the C# callback now
return;
}
答案 0 :(得分:1)
你的问题有点令人困惑。你是说你在DLL中有一个非导出的函数,你希望获取它的地址并传递给一些外部代码,它会调用它吗?这是完全合理的。如果它不起作用,请注意以下事项。
1)确保调用约定对函数的定义,DLL中函数指针的类型以及外部代码中声明的函数指针的类型是正确的。
2)在你的DLL中,尝试通过你传递给外部代码的相同的函数指针来调用回调。
3)如果(1)是正确的,并且(2)工作,那么启动你的调试器,在你尝试从外部代码调用回调的行上放置一个断点,然后进入反汇编。逐步通过电话,看看它到底在哪里。