Win32 LPDLGTEMPLATE 中未添加控件

Posted

技术标签:

【中文标题】Win32 LPDLGTEMPLATE 中未添加控件【英文标题】:Control not getting added in Win32 LPDLGTEMPLATE 【发布时间】:2014-09-15 19:58:53 【问题描述】:

在我的 Win32 应用程序中,我注册了一个名为“AX”的自定义类。

.rc 文件中定义的以下对话框资源按预期工作:

IDD_DIALOG1 DIALOGEX 0, 0, 457, 219
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    CONTROL "8856F961-340A-11D0-A96B-00C04FD705A2", IDC_EXPLORER1, "AX", WS_CHILD | WS_VISIBLE, 0, 0, 500, 400
END

但是,就我而言,我不能使用任何 .rc 文件。基本上,我需要在内存中构建 DLGTEMPLATE 并调用 DialogBoxIndirect。这是我的相关代码:

lpdt->style = DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_SYSMENU /*| DS_NOFAILCREATE*/;
lpdt->cdit = 1;         // Number of controls
lpdt->x = 10;  lpdt->y = 10;
lpdt->cx = 500; lpdt->cy = 400;

LPWORD lpw = (LPWORD)(lpdt + 1);
*lpw++ = 0;             // No menu
*lpw++ = 0;             // Predefined dialog box class (by default)

LPWSTR lpwsz = (LPWSTR)lpw;
int nchar = 1 + MultiByteToWideChar(CP_ACP, 0, "My Dialog", -1, lpwsz, 50);
lpw += nchar;

////-----------------------
//// Define the WebBrowser Control.
////-----------------------
lpw = lpwAlign(lpw); 
LPDLGITEMTEMPLATE lpdit = (LPDLGITEMTEMPLATE)lpw;
lpdit->x  = 0; lpdit->y  = 0;
lpdit->cx = 300; lpdit->cy = 300;
lpdit->id = IDC_EXPLORER1; 
lpdit->style = WS_CHILD | WS_VISIBLE;

// Class for the activeXControl
lpw = (LPWORD)(lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = atom; // Here, atom was obtained from RegisterClassEx() for class name "AX"

lpw = (LPWORD) (lpdit + 1);
lpwsz = (LPWSTR) lpw;
nchar = 1 + MultiByteToWideChar (CP_ACP, 0, "8856F961-340A-11D0-A96B-00C04FD705A2", -1, lpwsz, 2048); 
lpw   += nchar;
*lpw++ = 0; // no creation data

GlobalUnlock(hgbl);
LRESULT ret = DialogBoxIndirect(hinst, (LPDLGTEMPLATE)hgbl, hwndOwner, DialogProc);
GlobalFree(hgbl);

if (ret == -1) 
    int err = ::GetLastError();
    ReportError(err);

DialogBoxIndirect 的返回码是 -1。但是,GetLastError() 返回 0。奇怪。

如果我在对话框样式中指定 DS_NOFAILCREATE,则会创建对话框。但是,我需要的控件丢失了。

请帮助我找出我的代码中的问题。问候。

【问题讨论】:

你正确初始化COM了吗? 【参考方案1】:

看起来你的错误可能在这里:

// Class for the activeXControl
lpw = (LPWORD)(lpdit + 1);
*lpw++ = 0xFFFF;
*lpw++ = atom; // Here, atom was obtained from RegisterClassEx() for class name "AX"

lpw = (LPWORD) (lpdit + 1);   // <--- ERROR HERE
lpwsz = (LPWSTR) lpw;

您再次将lpw 重新分配给lpdit + 1,这意味着您将控件标题文本写在类原子上。看起来像一个糟糕的复制 + 粘贴作业。

【讨论】:

好收获。感谢您的帮助。我注释掉了这条线。但是,问题仍然没有消失。【参考方案2】:

让编译器创建对话框模板。只需使用二进制编辑器并复制序列并将其定义为 char 数组或其他任何内容。

我就是这样做的,它避免了错误。

【讨论】:

以上是关于Win32 LPDLGTEMPLATE 中未添加控件的主要内容,如果未能解决你的问题,请参考以下文章

如何创建一个 Win32 控件来包含其他 Win32 控件?

力控ADO组件添加Mysql数据源到这一步应该怎么办

win32下的贝塞尔曲线

原创一次远控木马分析

如何用visual studio

如何使用visual studio