遇到奇怪的情况,引用作为函数参数

时间:2013-09-18 12:28:30

标签: c++

有这种方法: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? (它已经是指针了吗?)。

3 个答案:

答案 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取消分配此内存块。