代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

避免资源冲突

  •  1
  • Cheok Yan Cheng  · 技术社区  · 15 年前

    // This is code in MFC exe
    HINSTANCE h = AfxLoadLibrary(_T("DLL.dll"));
    typedef void(*FUN)();
    FUN fun = (FUN)GetProcAddress(h, "loveme");
    FreeLibrary(h);
    

    MFC exe和MFC dll都有自己的资源文件。

    但是,我意识到,如果MFC exe和MFC dll具有相同的资源ID,则可能会发生冲突。

    // This is code in MFC dll. Both exe and dll, are having resources with
    // ID 101.
    CString s;
    s.LoadString(101);
    // Resource 101 in exe is being shown :(
    AfxMessageBox(s);
    

    我可以知道如何避免资源ID冲突问题吗?MFC和DLL中是否都有两个资源,虽然它们的ID不同,但它们是相互独立的?

    这意味着,DLL将只加载DLL的资源。EXE将只加载EXE的资源。

    2 回复  |  直到 15 年前
        1
  •  3
  •   YeenFei    15 年前

    你将需要保持跟踪处理自己,这将在dllmain传递。

    HINSTANCE hDLLInstance = 0;
    
    extern "C" int APIENTRY
    DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
    {
        hDLLInstance = hInstance;
        ...
    }
    

    然后,当您想要引用本地资源(即LoadString)时,传递dll句柄

    ...
    CString s; 
    s.LoadString(hDLLInstance, 101); 
    AfxMessageBox(s); 
    ...
    
        2
  •  0
  •   In silico    15 年前

    AfxGetInstanceHandle() 在MFC DLL中获取 HINSTANCE 到DLL。然后把它递给我 CString::LoadString() :

    /* Code in MFC DLL. */
    
    CString s;
    // Load resource 101 in the DLL.
    s.LoadString(AfxGetInstanceHandle(), 101); 
    AfxMessageBox(s); 
    
    推荐文章