none
动态调用winscard.dll里的SCardListReadersA不行,静态就可以。 RRS feed

  • 问题

  • 静态调用就可以,动态调用就不行,动态调用返回6,没有看到关于返回6错误类型。代码如下,麻烦大家帮忙看看什么问题

    参开:http://pcsclite.alioth.debian.org/api/group__API.html#ga93b07815789b3cf2629d439ecf20f0d9

    LONG  ScardListReaders(SCARDCONTEXT hContext, 
    LPSTR mszReader, 
    LPDWORD pcchReaders)
    {
    ULONG status = 0;
    HMODULE hModule = LoadLibraryA("winscard.dll");

    if (hModule != NULL)
    {
    FUNADDR  ScardListReaders = (FUNADDR)GetProcAddress(hModule, "SCardListReadersA");

    if (ScardListReaders != NULL)
    {
    status = ScardListReaders(hContext, NULL, NULL, pcchReaders);
    //SCardListReaders(hContext, NULL, NULL, pcchReaders);静态调用
    LPSTR mszReaders = (LPSTR)malloc(sizeof(char) * (*pcchReaders));
    status = ScardListReaders(hContext,
    NULL,
    mszReaders,
    pcchReaders);

    char* p = mszReaders;
    char* k = mszReader;

    for (int i = 0; i < *pcchReaders; i++)
    {
    if (*p == '\0')
    {
    *k = '#';
    }
    else
    {
    *k = *p;
    }

    k++;
    p++;
    }

    free(mszReaders);
    }
    }
    else
    {
    status = -1;
    }
    FreeLibrary(hModule);

    return status;
    }

    2017年11月27日 7:35

全部回复

  • Hi,

    感谢在MSDN论坛发帖。

    >>静态调用就可以,动态调用就不行,动态调用返回6,没有看到关于返回6错误类型。代码如下,麻烦大家帮忙看看什么问题

    错误6指的是ERROR_INVALID_HANDLE。 你可以通过调用SCardEstablishContext来设置正确的Resource manager context.

    另外,请检查你的项目属性是unicode类型还是ANSI类型。并检查LoadLibraryA和GetProcAddress的返回值是否正确。

    希望对你有所帮助。

    Best Regards,

    Baron Bi


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已建议为答案 Baron Bi 2017年12月12日 7:11
    2017年11月27日 9:06