在提取资源中对话框的时候发现有些资源文件不能正常显示出来,使用 Resource Hacker 这样的工具却可以显示出来,可能是因为某些类未注册的原因吧,还请高手赐教,如何才能正确提取 Shell32.dll 中资源编号为 1007 的对话框资源!注:以下代码可以正常提取 1003, 1004 等对话框,分别为 Run 和 Missing Shortcut 对话框,而 1007 则为 Run As 对话框,望高手指点,非常感谢!LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
HMODULE hModule;

switch (message) 
{
case WM_COMMAND:
wmId    = LOWORD(wParam); 
wmEvent = HIWORD(wParam); 

switch (wmId)
{
case IDM_DLG1003:
hModule=LoadLibrary("shell32.dll");
if (hModule != NULL)
{
DialogBox(hModule, (LPCTSTR)1003, hWnd, (DLGPROC)MyDlgProc);
FreeLibrary(hModule);
}
break;
case IDM_DLG1004:
hModule=LoadLibrary("shell32.dll");
if (hModule != NULL)
{
DialogBox(hModule, (LPCTSTR)1004, hWnd, (DLGPROC)MyDlgProc);
FreeLibrary(hModule);
}
break;
case IDM_DLG1007:
hModule=LoadLibrary("shell32.dll");
if (hModule != NULL)
{
DialogBox(hModule, (LPCTSTR)1007, hWnd, (DLGPROC)MyDlgProc);
FreeLibrary(hModule);
}
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}LRESULT CALLBACK MyDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_COMMAND:
EndDialog(hDlg, LOWORD(wParam));
return TRUE;
}
return FALSE;
}

解决方案 »

  1.   

    请确保 InitCommonControls 已经被调用还有如果是 Windows Xp Sp2 或者 Windows Server 2003 Sp1资源文件在 xpsp2res.dll 中
      

  2.   

    // 试过加上 InitCommonControls 也不行,还有没有其它原因呢?#include "commctrl.h"
    #pragma comment ( lib, "comctl32.lib" ) int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    InitCommonControls();
    INITCOMMONCONTROLSEX icex;
    icex.dwICC = ICC_LISTVIEW_CLASSES | ICC_TREEVIEW_CLASSES | ICC_BAR_CLASSES |
    ICC_TAB_CLASSES | ICC_UPDOWN_CLASS | ICC_PROGRESS_CLASS | ICC_HOTKEY_CLASS |
    ICC_ANIMATE_CLASS | ICC_DATE_CLASSES | ICC_USEREX_CLASSES | ICC_COOL_CLASSES |
    ICC_INTERNET_CLASSES | ICC_PAGESCROLLER_CLASS | ICC_NATIVEFNTCTL_CLASS;
    icex.dwSize = sizeof(INITCOMMONCONTROLSEX); if (InitCommonControlsEx(&icex) == false)
    MessageBox(NULL, "Error!", "Tip", MB_ICONINFORMATION | MB_OK); MSG msg;

    MyRegisterClass(hInstance);

    if (!InitInstance (hInstance, nCmdShow)) 
    {
    return FALSE;
    }

    while (GetMessage(&msg, NULL, 0, 0)) 
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }

    return msg.wParam;
    }
      

  3.   

    载入资源DLL  (1)在主应用程序类的.h文件中定义protected 的 HINSTANCE 类型变量(如:m_hInst);       (2)在主应用程序类的.cpp文件::InitInstance()函数过程中添加下面代码:     m_hInst = ::LoadLibrary("Image.dll");  // Image.dll为多语言纯资源的dll文件    if (m_hInst == NULL)      {          return FALSE; //载入资源失败    }      else {  // 成功载入资源       // 当资源载入成功后,你可以使用AfxSetResourceHandle( 纯资源DLL句丙) 用资源DLL 里的       // 替换你程序中的 资源ID ,这样你程序中所用的 资源ID 就是  资源DLL 里的 资源ID 了。        AfxSetResourceHandle(m_hInst); // get resources from the DLL      } 释放资源DLL在主应用程序类的.cpp文件::ExitInstance()函数过程中添加下面代码: FreeLibrary(m_hInst);// 记着要释放
      

  4.   

    还是搞不定,哪位大哥能帮我调试一下,只要能把 1007 这个对话框提取出来就可以了,源代码在此处下载,解决该问题后再开新贴送分。
    http://down.itchinese.com/other/learn/vc6/DlgTest.rar
      

  5.   

    顶下先,刚买了本看雪学院的<<软件加密码技术剖析>>上面有好多分析PE格式的,不过,看不太懂,哎,一直说想学ASM,却一直没时间,也找不到可以请教的人,看来不啃ASM想成高人还真是很难呀!