0

有这个方法:SCardListReaders,有这样的参数:

LONG WINAPI SCardListReaders(
  _In_      SCARDCONTEXT hContext,
  _In_opt_  LPCTSTR mszGroups,
  _Out_     LPTSTR mszReaders,
  _Inout_   LPDWORD pcchReaders
);

并被这样称呼(来自MSDN):

LPTSTR          pmszReaders = NULL;
LPTSTR          pReader;
LONG            lReturn, lReturn2;
DWORD           cch = SCARD_AUTOALLOCATE;

// Retrieve the list the readers.
// hSC was set by a previous call to SCardEstablishContext.
lReturn = SCardListReaders(hSC,
                           NULL,
                           (LPTSTR)&pmszReaders,
                           &cch );
...

我对pmszReaders变量感到困惑。特别是,对于 Unicode 构建WCHAR*,我已经理解了,那么为什么要&pmszReaders传递给ScardListReaders上面的函数,为什么不直接传递pmszReaders呢?(它已经是一个指针,对吧?)。

4

3 回答 3

0

使用起来有点迟钝,(LPTSTR)&pmszReaders但根据函数文档,您会看到 pmszReaders 是一个Multi-string. 他们LPTSTR通过将内存分配给LPTSTR您传入的指针来为您提供一个数组。

LPTSTR使用而不是背后的原因LPTSTR*是微软 API 不喜欢*在他们的 API 函数中使用,因此 LPTSTR 首先存在。

为了澄清,LPTSTR您返回的格式为:

name1\0name2\0name3\0

使其成为LPTSTR而不是LPTSTR*.

您可以放心地忽略_in_ _Out_代码部分,它们用于 Microsoft 分析和一般帮助。它们对编译的代码没有任何影响。

于 2013-09-18T12:37:25.120 回答
0

来自 MSDN:

mszReaders [out]

    Multi-string that lists the card readers within the supplied reader groups. 
    If this value is NULL, SCardListReaders ignores the buffer length supplied 
    in pcchReaders, writes the length of the buffer that would have been 
    returned if this parameter had not been NULL to pcchReaders, 
    and returns a success code.

它是一个多字符串 - 作为字符串数组 - 因此您需要将第一个阅读器的地址作为参数(pmszReaders 是 a WCHAR*,换句话说是 " wstring" )。

于 2013-09-18T12:40:31.153 回答
0

通常,您将指针传递给预分配的缓冲区(a LPTSTR)。这就是为什么mszReaders声明为LPTSTR.

但请注意,这SCARD_AUTOALLOCATE是作为最后一个参数传递的。只有在这种情况下,mszReaders才被解释为指向指针的指针。

来自 MSDN:

pcchReaders [输入,输出]

mszReaders 缓冲区的长度(以字符为单位)。此参数接收多字符串结构的实际长度,包括所有尾随空字符。如果缓冲区长度指定为 SCARD_AUTOALLOCATE,则 mszReaders 将转换为指向字节指针的指针,并接收包含多字符串结构的内存块的地址。必须使用 SCardFreeMemory 释放此内存块。

于 2013-09-18T13:23:06.487 回答