调用Winspool API GetJOB问题

时间:2017-10-18 03:00:42

标签: c++ pointers winapi visual-c++

我正在编写一个Visual C ++程序来获取打印作业详细信息。 代码如下:

HANDLE hPrinter;
DWORD needed, returned, byteUsed,level;
JOB_INFO_2   *pJobStorage1=NULL;
level = 2;

GetJob(hPrinter, jobId, level, NULL, 0, &needed);
if (GetLastError()!=ERROR_INSUFFICIENT_BUFFER)
    cout << "GetJobs failed with error code"
    << GetLastError() << endl;
pJobStorage1 = (JOB_INFO_2 *)malloc(needed);
ZeroMemory(pJobStorage1, needed); 
cout << GetJob(hPrinter, jobId, level, (LPBYTE)pJobStorage1, needed, (LPDWORD)&byteUsed) << endl;
cout << pJobStorage1[0].pPrinterName<<endl;

根据documentation,pJobStorage1的输出不是数组,但是,当我更改时IDE报告错误

 pJobStorage1[0].pPrinterName

  pJobStorage1.pPrinterName

所以,我想知道发生了什么。

1 个答案:

答案 0 :(得分:0)

你有一个指针。只需看到声明JOB_INFO_2 *pJobStorage1=NULL

即可

使用pJobStorage1[0].pPrinterNamepJobStorage1->pPrinterName,您可以访问pJobStorage1指向的第一个元素。

pJobStorage1.pPrinterName无效,因为pJobStorage1并且您无法拒绝指针。操作

如果您定义数组JOB_INFO_2 foo[5]。 foo本身是第一个数组元素的地址/指针。因此,您可以使用foo而不是JOB_INFO_2 *。因此,如果您有一个数组名称,则可以使用它而不是指针。指针还定义了特定类型元素的地址。您可以将它用作数组。

指针和数组具有可互换的用法。

struct A
{
    int a;
};

void Foo()
{
    A a[3], *pa;
    pa = a;

    A b;
    // Accessing first element
    b = *a;
    b = a[0];
    b = pa[0];
    b = *pa;

    // Accessing second element
    b = a[1];
    b = pa[1];
    b = *(pa+1);

    // accessing member in first element.
    int c;
    c = a[0].a;
    c = pa[0].a;
    c = pa->a;
    c = (*pa).a;
}