在DLL里面添加了一个对话框 然后与他关联一个类 叫 C123  然后别的程序要调用这个DLL  如下:C123 *TipsDlg;
extern "C" _declspec(dllexport) void 2()
{
TipsDlg = new C123;
TipsDlg->DoModal();
}为啥我调用这个DLL  程序报错?  哪儿写错了?

解决方案 »

  1.   

    资源!你在DLL调用的,那么,你的资源放在那儿?
      

  2.   

    什么资源?  一调用  void 2() 这个函数就报错 
      

  3.   

    首先
    TipsDlg = new C123;
    TipsDlg->DoModal();
    new出来的要Create
    再Show再者
    EXE调用 DLL中的函数实现弹出对话框,对话框是DLL中的
    你需要资源切换的给你一个DLL切换的类(基本MFC扩展DLL):
    仿照Xtreme Toolkit中的CXTManageState做一个资源切换的类,一直在用,没用问题:
    ManageStateEx.h
    class CManageStateEx 
    {
    public:
    CManageStateEx();
    virtual ~CManageStateEx();public:
    static void SetModuleInfo(HMODULE hResource, HMODULE hInstance);private:
    void Undo();
    void Redo();private:
    HMODULE m_hOldInstance;
    HMODULE m_hOldResource;
    BOOL m_bSet;private:
    static HMODULE s_hInstance;
    static HMODULE s_hResource;
    };
    //////////////////////////////////////////////////////////
    ManageStateEx.cppHMODULE CManageStateEx::s_hInstance = NULL;
    HMODULE CManageStateEx::s_hResource = NULL;CManageStateEx::CManageStateEx()
    {
    Redo();
    }CManageStateEx::~CManageStateEx()
    {
    Undo();
    m_hOldResource = NULL;
    m_hOldInstance = NULL;
    }void CManageStateEx::SetModuleInfo(HMODULE hResource, HMODULE hInstance)
    {
    s_hInstance = hInstance;
    s_hResource = hResource;
    }void CManageStateEx::Undo()
    {
    if (!m_bSet) return;
    AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
    pModuleState->m_hCurrentResourceHandle = m_hOldResource;
    pModuleState->m_hCurrentInstanceHandle = m_hOldInstance;
    m_bSet = false;
    }void CManageStateEx::Redo()
    {
    ASSERT(s_hInstance != NULL);
    ASSERT(s_hResource != NULL);
    AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
    m_hOldResource = pModuleState->m_hCurrentResourceHandle;
    m_hOldInstance = pModuleState->m_hCurrentInstanceHandle;
    pModuleState->m_hCurrentResourceHandle = s_hResource;
    if (pModuleState->m_hCurrentInstanceHandle == NULL)
    {
    pModuleState->m_hCurrentInstanceHandle = s_hInstance;
    }
    m_bSet = true;
    }
    这个类用法:在你的扩展DLL 的DllMain函数中new CDynLinkLibrary(g_extensionDLL);语句后面加下下面一行代码:
    CManageStateEx::SetModuleInfo(g_extensionDLL.hResource, g_extensionDLL.hModule);
    在stdafx.h中加入如下宏定义:
    #define SWITCH_TO_DLL_RESOURCE_HANDLE CManageStateEx MngStateEx;在用到资源切换的地方如要弹出对话框之前加入
    SWITCH_TO_DLL_RESOURCE_HANDLE 
    就好了。不要再为资源切换而伤脑筋了,只要就这个类,再加上几句代码就搞定。
      

  4.   

    .LIB和.DLL文件都要放在当前文件夹里,当然,如果你是动态加载的就不要。LIB文件了
      

  5.   

    我不是扩展MFC  是规则的MFC  也要这样做?而且我是用其他语言 比如 DELPHI或者VB 调用这个DLL
      

  6.   

    哦 解决了。必须 静态MFC 编译才可以!