【发布时间】:2021-09-22 12:33:09
【问题描述】:
我正在使用 Win32 API 和 C。 我需要获得系统默认打印机支持的页面大小。 参考这个论坛上的DeviceCapabilities of a network printer(建议使用 PrintDlg),我正在尝试使用 PrintDlgEx,Flags=PD_RETURNDEFAULT。 我的问题是,调用 PrintDlgEx 失败并出现错误“E_INVALIDARG”,即 Invalid Argument。 我已将代码编写为控制台程序。 谁能帮我找出问题所在。
我的代码贴在下面
int main(void)
{
HWND Myhwnd = GetConsoleWindow();
if (Myhwnd == NULL)
printf("GetConsoleWindow Failed \n");
PRINTDLGEX pdlg;
memset(&pdlg, 0, sizeof(PRINTDLGEX));
pdlg.lStructSize = sizeof(PRINTDLGEX);
pdlg.hwndOwner = Myhwnd;
pdlg.Flags = PD_RETURNDEFAULT|| PD_NOPAGENUMS;
pdlg.nCopies = 1;
pdlg.nPropertyPages = 0;
pdlg.dwResultAction = 0;
pdlg.nStartPage = START_PAGE_GENERAL;
HRESULT result = PrintDlgEx(&pdlg);
switch (result)
{
... ...
case E_INVALIDARG:
printf("Invalid Argument\n");
break;
}
return 0;
}
我在 PrintDlgEx 文档中注意到它说“必须使用内存分配函数动态声明此结构。”。所以我改变了我的程序如下,但仍然给出同样的错误“无效参数”。
int main(void)
{
HWND Myhwnd = GetConsoleWindow();
if (Myhwnd == NULL)
printf("GetConsoleWindow Failed \n");
PRINTDLGEX * pdlg;
pdlg = malloc(sizeof(PRINTDLGEX));
memset(pdlg, 0, sizeof(PRINTDLGEX));
pdlg->lStructSize = sizeof(PRINTDLGEX);
pdlg->hwndOwner = Myhwnd;
pdlg->Flags = PD_RETURNDEFAULT|| PD_NOPAGENUMS;
pdlg->nCopies = 1;
pdlg->nPropertyPages = 0;
pdlg->dwResultAction = 0;
pdlg->nStartPage = START_PAGE_GENERAL;
HRESULT result = PrintDlgEx(pdlg);
switch (result)
{
... ...
case E_INVALIDARG:
printf("Invalid Argument\n");
break;
}
return 0;
}
【问题讨论】:
-
PD_RETURNDEFAULT|| PD_NOPAGENUMS使用布尔或。你当然想要二进制 OR,即PD_RETURNDEFAULT | PD_NOPAGENUMS。 -
感谢 IInspectable 和 @fpiette。我进行了更改,程序运行正常(我得到返回码“成功”。而且,是的,这是一个愚蠢的错误 :)。