为什么打印机';如果程序是从windows服务执行的,则DocumentProperties()会错误地报告程序的方向设置

为什么打印机';如果程序是从windows服务执行的,则DocumentProperties()会错误地报告程序的方向设置,windows,visual-c++,printing,Windows,Visual C++,Printing,我有一个VC++控制台应用程序,它有一个读取打印机当前方向设置的功能。使用中的示例代码,我可以在cmd提示符下执行程序时成功读取打印机的设置。但是,如果我从Windows服务(用C#编写)执行它,当前方向将始终返回为1(纵向),即使其他设置看起来正确。为什么呢 总结一下: 对于方向设置为横向的打印机,如果从cmd.exe运行,下面的代码将正确输出: 原始打印机方向=2 但如果从使用C#编写的windows服务运行,则始终输出: 原始打印机方向=1 /* *步骤1: *分配一个大小正确的缓冲区。

我有一个VC++控制台应用程序,它有一个读取打印机当前方向设置的功能。使用中的示例代码,我可以在cmd提示符下执行程序时成功读取打印机的设置。但是,如果我从Windows服务(用C#编写)执行它,当前方向将始终返回为1(纵向),即使其他设置看起来正确。为什么呢

总结一下: 对于方向设置为横向的打印机,如果从cmd.exe运行,下面的代码将正确输出:

原始打印机方向=2

但如果从使用C#编写的windows服务运行,则始终输出:

原始打印机方向=1

/*
*步骤1:
*分配一个大小正确的缓冲区。
*/
dwNeeded=DocumentProperties(空,
hPrinter,/*手柄连接到我们的打印机*/
deviceName,/*打印机的名称*/
NULL,/*要求大小,所以*/
NULL,/*不使用这些值*/
0);             /* 零返回缓冲区大小*/
pDevMode=(LPDEVMODE)malloc(dwNeeded);
/*
*步骤2:
*获取打印机的默认DevMode,然后
*根据您的需要修改它。
*/
dwRet=DocumentProperties(空,
hPrinter,
deviceName,
pDevMode,/*要填充的缓冲区的地址*/
NULL,/*不使用输入缓冲区*/
DM_OUT_BUFFER);/*填充输出缓冲区*/
if(dwRet!=IDOK)
{
/*如果失败,则清除和返回失败*/
免费(PDEV模式);
闭式打印机(hPrinter);
返回NULL;
}

cout这是由于权限。Windows服务是在“本地系统”下运行的,这当然不能识别我在自己的登录名下所做的打印机设置更改。感谢退休的忍者让我想到了权限。

你试过打印什么吗?也许不同的用户意味着不同的设置,它被设置为该用户的肖像模式。是的,打印工作正常。事实上,一切都很好,包括字体名称、大小、副本等。方向是唯一返回不同值的方向。我正在我的电脑上执行程序,Windows服务也在我的电脑上运行。
/*
* Step 1:
* Allocate a buffer of the correct size.
*/
dwNeeded = DocumentProperties(NULL,
    hPrinter,       /* Handle to our printer. */
    deviceName,        /* Name of the printer. */
    NULL,           /* Asking for size, so */
    NULL,           /* these are not used. */
    0);             /* Zero returns buffer size. */
pDevMode = (LPDEVMODE)malloc(dwNeeded);

/*
* Step 2:
* Get the default DevMode for the printer and
* modify it for your needs.
*/
dwRet = DocumentProperties(NULL,
    hPrinter,
    deviceName,
    pDevMode,       /* The address of the buffer to fill. */
    NULL,           /* Not using the input buffer. */
    DM_OUT_BUFFER); /* Have the output buffer filled. */
if (dwRet != IDOK)
{
    /* If failure, cleanup and return failure. */
    free(pDevMode);
    ClosePrinter(hPrinter);
    return NULL;
}

cout << "original printer orientation=";
cout << pDevMode->dmOrientation;