我正在尝试通过Windows服务(作为“本地系统”运行)在Win10系统上与智能卡进行通信。
调用SCardEstablishContext
初始化上下文时,即使智能卡服务“ SCardSvr”显示为由任务管理器运行,返回值也为SCARD_E_NO_SERVICE
。
如果我尝试在代码中启动“ SCardSvr”,然后调用GetLastError()
,则返回1056,它对应于ERROR_SERVICE_ALREADY_RUNNING
(“服务实例已在运行。”)
很遗憾,此处https://blogs.msdn.microsoft.com/alejacma/2011/05/19/scardestablishcontext-fails-with-scard_e_no_service-error/列出的解决方法没有任何改变。
这是我正在使用的代码:
// try to establish context
ret = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &mContext);
// check if smartcard service is running
if (ret == SCARD_E_NO_SERVICE)
{
SC_HANDLE hSCManager = OpenSCManagerA(
NULL, // lpMachineName
NULL, // lpDatabaseName
SC_MANAGER_ALL_ACCESS // dwDesiredAccess
);
SC_HANDLE hService = OpenServiceA(
hSCManager,
"SCardSvr", // lpServiceName
SERVICE_START // dwDesiredAccess
);
BOOL res = StartServiceA(
hService,
0, // dwNumServiceArgs
NULL // lpServiceArgVectors
);
DWORD errorCode = GetLastError(); // returns 1056
}
如果智能卡服务“ SCardSvr”据说正在运行,我希望SCardEstablishContext
返回除SCARD_E_NO_SERVICE
之外的其他信息。