none
dll中接口参数问题 RRS feed

  • 问题

  • dll中的接口为

     extern "C" __declspec(dllexport) void Show(CString a)

    {
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    AfxMessageBox(s);
    }

    调用时我用
    typedef void (WINAPI * TESTDLL)(CString);
    HINSTANCE hmod;
    hmod = ::LoadLibrary ("MFCDLL.dll");
    if(hmod==NULL)
    {
    AfxMessageBox("Fail");
    }
    TESTDLL lpproc;
    lpproc = (TESTDLL)GetProcAddress (hmod,"Show");
    lpproc("ff");

    FreeLibrary(hmod);
    程序可以显示 ff 这个窗口  然后程序就报错终止了  不过接口没有参数的话就没有问题  
    请指教    

    C++
    2010年5月21日 10:34

答案

  • 换用标准的类型,如果类型太过复杂可以考虑像COM一样传递纯虚接口,比如 

    extern "C" __declspec(dllexport) void ShowA(LPSTR a);

    extern "C" __declspec(dllexport) void ShowW(LPWSTR a);

     

    struct IShow

    {

        virtual void Show(BSTR a)=0;

    };

    extern "C" __declspec(dllexport) HRESULT CreateShower(IShow** ppShow)

    extern "C" __declspec(dllexport) HRESULT DeleteShower(IShow* pShow)



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 Nancy Shao 2010年6月18日 3:12
    2010年5月21日 14:42
    版主

全部回复

  • 用DumpBin看看,加了参数之后函数名变了。如果你要在DLL接口里面用MFC类,那么DLL需要是MFC扩展DLL,并且EXE需要是MFC程序。

    PS 用C++类(STL,MFC等等)做接口在DLL和EXE编译选项造成对类有不同解读的时候可能造成程序崩溃。如果你一定要用标准DLL做接口,建议还是用标准的C。



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年5月21日 14:10
    版主
  • 能不能给我一个范例啊  759848155@qq.com  也可以把代码贴给我


    C++
    2010年5月21日 14:24
  • 换用标准的类型,如果类型太过复杂可以考虑像COM一样传递纯虚接口,比如 

    extern "C" __declspec(dllexport) void ShowA(LPSTR a);

    extern "C" __declspec(dllexport) void ShowW(LPWSTR a);

     

    struct IShow

    {

        virtual void Show(BSTR a)=0;

    };

    extern "C" __declspec(dllexport) HRESULT CreateShower(IShow** ppShow)

    extern "C" __declspec(dllexport) HRESULT DeleteShower(IShow* pShow)



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    • 已标记为答案 Nancy Shao 2010年6月18日 3:12
    2010年5月21日 14:42
    版主
  • 此问题我之前也遇到过,在项目中,居然花了数小时去调试这个问题!很郁闷!

    看看这个吧:  dll导出中函数中使用CString类型的参数引发的ESP出错

    2010年5月26日 6:53