extern "C" _declspec(dllexport) int tjjd(_ConnectionPtr m_pConnection, CGeoresource *pGeores)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CJDtjjdDlg dlg(m_pConnection, pGeores);
dlg.DoModal();
return  0;
}调用时:
typedef int (WINAPI *AddNodeDLL)(int _ConnectionPtr, CGeoresource*);
HINSTANCE hmod;
hmod = ::LoadLibrary ("strDllName.dll");
if(hmod==NULL)
{
AfxMessageBox("Fail");
}

AddNodeDLL lpproc;
lpproc = (AddNodeDLL)GetProcAddress(hmod, "tjjd");
if(lpproc == NULL) AfxMessageBox("lpproc is Null");
if(lpproc != NULL)
(*lpproc)(theApp.pComm->connPtr, geoRes);

FreeLibrary(hmod);函数倒是能执行,但执行完就出错,但不穿参数就没有错误.
为什么呀?

解决方案 »

  1.   

    问我吗?我不太清楚,如果改成
    extern "C" _declspec(dllexport) int __stdcall tjjd(_ConnectionPtr m_pConnection, CGeoresource *pGeores)
    则会找不到该函数.
      

  2.   

    你用了extern "C",就不能用c++的内容
      

  3.   

    用了__stdcall后,要用.def文件导出这个函数
      

  4.   

    补充一下我说的问题是在release版下的问题,debug版下好使
     oyljerry(☆勇敢的心☆) 如果如你所说:那我还想用C++的东西,我该怎么办?
      

  5.   

    to:谢谢你,其实我不行用.def,所以我也没加__stdcall,不加的话可以找到,但执行完有问题,我想还是参数的问题,因为不加参数是也好使,但加了参数在执行完时就有问题了。
      

  6.   

    typedef int (WINAPI *AddNodeDLL)(int _ConnectionPtr, CGeoresource*);
    --->
    typedef int (WINAPI *AddNodeDLL)(_ConnectionPtr, CGeoresource*);
      

  7.   

    to:wanamaker() ,谢谢你,你说的是,是我写错了改过来了,
    另外我知道我真正错在哪了,把WINAPI换成FAR __cdecl 就好使了
    看来是入栈问题,我疏忽了!!
    但有一点我还是不懂,我什么好多人多用__stdcall?
      

  8.   

    标准调用嘛。
    "没有这个头是C的约定,在Call函数后面会有ADD ESP xxx"
    加上__stdcal后,这条指令就没有了。
      

  9.   

    __stdcall是C标准的接口约定,_cdcel是C++的。两者的压栈方式不一样(参考MSDN),在函数调用完成后,由于找不到调用函数的返回地址,结果往往会发生栈出错。调用时候,直接用typedef int (*AddNodeDLL)(int _ConnectionPtr, CGeoresource*);不需要声明为FAR