我正在创建自定义凭据提供程序包装器。 Windows 7 SDK示例凭据提供程序包装器完成了我想要的大部分工作,因此我的计划是从它开始并进行修改,以便它执行我需要的所有操作。
然而,我遇到了一个小问题。我想使用Visual Studio 2012进行开发工作。这些示例是使用Visual Studio 2008创建的。在使用Visual Studio 2008时,我已经能够成功构建和使用示例提供程序。但是,当我尝试将项目导入Visual Studio 2012时,它将编译得很好,但它没有'当我尝试使用它时工作。我已经能够使用WinDbg验证凭据提供程序在锁定/登录屏幕上加载但没有显示任何内容。不幸的是,我不太了解WinDbg能够使用该工具追踪问题。
在研究使用win32平台为64位计算机编译凭据提供程序时出现的问题时,我看到了其他地方出现的建议。我使用的是64位计算机,并确保我在两个版本的Visual Studio中使用x64平台进行编译。
另外值得一提的是,在完成VS2008到VS2012的转换后,似乎没有任何问题,我不得不将“运行时库”设置从“多线程DLL(/ MD)”更改为“多线程( /公吨)”。这是VS2008项目中的原始设置。有可能让凭据提供程序“工作”(又名不会丢失有关丢失的DLL依赖项的错误)而不进行此更改,但我必须首先为Visual Studio 2012安装Visual C ++ Redistributable。进行此更改将删除该依赖项。
有关如何解决此问题并在VS2012中成功编译凭据提供程序示例的任何建议?
更新
在同一台机器上安装VS2008和VS2012后,我可以将“Platform Toolset”属性从“Visual Studio 2012(v110)”更改为“Visual Studio 2008(v90)”。一旦进行了这项更改,编译就会起作用,凭证提供程序就像使用VS2008直接编译时一样。此测试没有更改其他设置。我可以使用这个解决方案,但似乎我应该能够使用VS2012平台工具集让它工作,所以我不想再解决这个问题,因为VS2008链接器可能非常错误。
答案 0 :(得分:1)
事实证明,随着Windows 8的发布以及随后对凭据提供程序的更改,从Visual Studio 2012开始,常量CLSID_PasswordCredentialProvider开始指向v2密码凭据提供程序而不是v1密码凭据提供程序(版本) Windows 7使用的)。因此,为了使包装的凭据提供程序示例能够正确编译(我正在测试的那个),有必要在CSampleProvider.cpp中更改以下行:
hr = CoCreateInstance(CLSID_PasswordCredentialProvider, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pUnknown));
转而指向V1凭据提供程序:
hr = CoCreateInstance(CLSID_V1PasswordCredentialProvider, NULL, CLSCTX_ALL, IID_PPV_ARGS(&pUnknown));
完成此操作并重新编译并安装项目后,它按预期工作。