DLL中的回调?

时间:2009-11-05 18:09:26

标签: c dll callback

我在 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;
}

1 个答案:

答案 0 :(得分:1)

你的问题有点令人困惑。你是说你在DLL中有一个非导出的函数,你希望获取它的地址并传递给一些外部代码,它会调用它吗?这是完全合理的。如果它不起作用,请注意以下事项。

1)确保调用约定对函数的定义,DLL中函数指针的类型以及外部代码中声明的函数指针的类型是正确的。

2)你的DLL中,尝试通过你传递给外部代码的相同的函数指针来调用回调。

3)如果(1)是正确的,并且(2)工作,那么启动你的调试器,在你尝试从外部代码调用回调的行上放置一个断点,然后进入反汇编。逐步通过电话,看看它到底在哪里。