有这种方法: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
? (它已经是指针了吗?)。
答案 0 :(得分:0)
使用(LPTSTR)&pmszReaders
有点迟钝但根据函数文档,你会看到pmszReaders是Multi-string
。
他们通过向你传入的LPTSTR
指针生成内存来为你提供一个LPTSTR
数组。
使用LPTSTR
代替LPTSTR*
背后的原因是Microsoft API不喜欢在其API函数中使用*
,因此LPTSTR首先存在。
为了澄清,您返回的LPTSTR
格式为:
name1\0name2\0name3\0
将其设为LPTSTR
而不是LPTSTR*
。
您可以安全地忽略代码的_in_ _Out_
部分,它们用于Microsoft分析和一般帮助。它们对编译的代码没有任何影响。
答案 1 :(得分: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是WCHAR*
,换句话说a" wstring
")。
答案 2 :(得分:0)
通常,您将指针传递给预先分配的缓冲区(LPTSTR
)。这就是为什么mszReaders
被声明为LPTSTR
。
但请注意,SCARD_AUTOALLOCATE
作为最后一个参数传递。仅在这种情况下,mszReaders
被解释为指针指针。
来自MSDN:
pcchReaders [in,out]
mszReaders缓冲区的长度(以字符为单位)。此参数接收多字符串结构的实际长度,包括所有尾随空字符。如果缓冲区长度指定为SCARD_AUTOALLOCATE,则mszReaders将转换为指向字节指针的指针,并接收包含多字符串结构的内存块的地址。必须使用SCardFreeMemory取消分配此内存块。