【问题标题】:PrintDlgEx fails with "Invalid Argument"PrintDlgEx 因“无效参数”而失败
【发布时间】: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。我进行了更改,程序运行正常(我得到返回码“成功”。而且,是的,这是一个愚蠢的错误 :)。

标签: c winapi printing


【解决方案1】:

我已使用 MSVC2019 检查了您的代码。正如 IInspectable 在评论中所说,错误是使用布尔或 || 运算符而不是按位或 |operator。

我还检查了调用是使用静态分配的 PRINTDLGEX 变量还是动态分配的变量。

代码是:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

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 S_OK:
        printf("Success\n");
        break;
    case E_INVALIDARG:
        printf("Invalid Argument\n");
        break;
    default:
        printf("Error %d\n", result);
        break;
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 2022-10-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    相关资源
    最近更新 更多