首页
社区
课程
招聘
[求助]关于MFC自动加载appCHS.dll的问题
发表于: 2012-1-3 22:14 5658

[求助]关于MFC自动加载appCHS.dll的问题

2012-1-3 22:14
5658
假设现在有一个MFC程序 1.exe
我在调试MFC7.1的程序发现 系统会自动加载 "1CHS.dll" 这个文件
经过查找资料发现是在
C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc\appcore.cpp
里面的 CWinApp::InitInstance() 出现的 具体代码是这样的

BOOL CWinApp::InitInstance()
{
        InitLibId();
        m_hLangResourceDLL = LoadAppLangResourceDLL();
        if(m_hLangResourceDLL != NULL)
        {
                AfxSetResourceHandle(m_hLangResourceDLL);
                _AtlBaseModule.SetResourceInstance(m_hLangResourceDLL);
        }

        return TRUE;
}

HINSTANCE CWinApp::LoadAppLangResourceDLL()
{
        TCHAR szFormat[MAX_PATH];
        LPTSTR pszExtension;

        int ret = ::GetModuleFileName(m_hInstance, szFormat, MAX_PATH);
        if(ret == 0 || ret == MAX_PATH)
        {
                ASSERT(FALSE);
                return NULL;
        }
        pszExtension = ::PathFindExtension(szFormat);
       
       
        TCHAR szExt[] = _T("%s.dll");
        if((pszExtension - szFormat + _countof(szExt)) > MAX_PATH)
        {
                ASSERT(FALSE);
                return NULL;
        }
       
        lstrcpy(pszExtension, szExt);

        return AfxLoadLangResourceDLL(szFormat);
}

现在问题是如果1.exe 当前目录没有 1CHS.dll这个问题 运行会很正常
如果我放一个空的DLL 代码很简单就return TRUE 这个时候把1.exe运行
起来 进程里面有 但是界面就不显示了 为什么?

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 121
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
这个很容易理解:
当前目录没有DLL,那么 执行LoadAppLangResourceDLL函数之后:
m_hLangResourceDLL==NULL, 就会 return TRUE
否则:m_hLangResourceDLL!=NULL ,就会AfxSetResourceHandle,把DLL的资源作为EXE的默认资源,EXE程序也就没有界面了
2012-1-3 22:25
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
明白了 有什么方法可以让它加载这个1CHS.DLL而程序正常运行呢
2012-1-3 22:52
0
雪    币: 19
活跃值: (1086)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
知道了 把资源拷贝过去就行  了。
2012-1-3 23:26
0
雪    币: 242
活跃值: (468)
能力值: ( LV11,RANK:188 )
在线值:
发帖
回帖
粉丝
5
最好动态修改m_hLangResourceDLL的值为原程序的值,可以从应用程序调用的那个MFC71.dll中调用AfxGetModuleState()->m_hLangResourceDLL 来得到。

MFC程序都会动态搜索本地化的资源文件,也就是 ***chs这些。这是在自带的代码中可以看到的,参看
http://www.codeproject.com/KB/cpp/mfcprogflow.aspx
2012-1-4 01:17
0
雪    币: 121
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
把资源做到DLL中,或者
把下面这些代码去掉:
m_hLangResourceDLL = LoadAppLangResourceDLL();
  if(m_hLangResourceDLL != NULL)
  {
    AfxSetResourceHandle(m_hLangResourceDLL);
    _AtlBaseModule.SetResourceInstance(m_hLangResourceDLL);
}
2012-1-4 13:07
0
游客
登录 | 注册 方可回帖
返回
//