我的步骤:
1.创建动态库,加入接口函数如下
extern "C" __declspec(dllexport) void OrderDetailShow(CDatabase* pDb,
CString sMode,CString sOrderNo,CString sOption)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); /*
COrderDetail dlgOrderDetail;
dlgOrderDetail.m_pDb=pDb;

dlgOrderDetail.DoModal();
         */COrderDetail * pDlg = NULL;
   
//---------------------------------------------
pDlg = new COrderDetail();
pDlg->m_pDb=pDb;
pDlg->Create( IDD_ORDERDETAIL);

pDlg->ShowWindow( SW_SHOW );
pDlg->UpdateWindow();//-------------------------------------------- return ;
}2.创建EXE测试程序,调用DLL HINSTANCE hmod;
TESTDLL lpproc; typedef void (* __stdcall TESTDLL)(CDatabase* pDb,CString sMode,CString sOrderNo,CString sOption);
hmod = ::LoadLibrary (sDllName);
if(hmod==NULL)
{
AfxMessageBox("Fail");
}


lpproc = (TESTDLL)GetProcAddress (hmod,sDllInterface);
ASSERT(lpproc);
CWnd* pwnd=this->GetWindow(GW_OWNER);
if(lpproc!=(TESTDLL)NULL)
(*lpproc)(theDb,sOptionA,sOptionB,theName,pwnd);


FreeLibrary(hmod); 请问:为何我的动态库调用就出错呢?是因为非模式对话框的问题码,原来是模式对话框,就好用〉

解决方案 »

  1.   

    1、对于非模式对话框,lpproc(...)之后不能马上就freelibrary
    2、对于非模式对话框,由于本身没有消息循环,所以需要调用者提供消息循环
      

  2.   

    (*lpproc)(theDb,sOptionA,sOptionB,theName,pwnd);
    这个好像和你的动态库函数不一样啊,pwnd传给谁啊???
      

  3.   

    TO happyparrot(快乐鹦鹉) 
    COPY错了,应该是
    if(lpproc!=(TESTDLL)NULL)
    (*lpproc)(theDb,sOptionA,sOptionB,theName);原来我认为pDlg->Create( IDD_ORDERDETAIL)这个函数必须要父窗口句柄来着,但也不好用。
    TO flyelf(空谷清音) 1、对于非模式对话框,lpproc(...)之后不能马上就freelibrary
    能具体些么,按我的代码,应该如何做呢?2、对于非模式对话框,由于本身没有消息循环,所以需要调用者提供消息循环
    消息循环放在哪里阿,是EXE里么
      

  4.   

    我是在exe建个对话框,然后放个按钮,通过click来启动dll调用的