我可以创建与提交按钮相同的CommandLink吗?

时间:2018-06-28 02:45:28

标签: c++ windows credential-providers

请理解我缺乏写作技巧。

我正在测试以创建自定义凭据提供程序。 我要创建一个CommandLink,该按钮使用“提交”按钮执行相同的操作。 我想通过CommandLink与“提交”按钮分开登录。 当前,只有自定义凭据提供程序通过providerFilter::Filter(CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus, DWORD dwFlags, GUID* rgclsidProviders, BOOL* rgbAllow, DWORD cProviders)公开。 enter image description here 单击[anator longon按钮]登录。

这是我的示例代码:

 HRESULT CSampleCredential::CommandLinkClicked(DWORD dwFieldID)
 {
     HRESULT hr = S_OK;
     DWORD dwResult = 0;

     if (dwFieldID < ARRAYSIZE(_rgCredProvFieldDescriptors) &&
         (CPFT_COMMAND_LINK == _rgCredProvFieldDescriptors[dwFieldID].cpft))
     {
         HWND hwndOwner = nullptr;
         switch (dwFieldID)
         {
         case SFI_ANATHOR_SUBMIT_LINK:
             dwResult = function_foo();
             if(dwResult == 1) { 
                  Call GetSerialization()...?
                  Run the logon.
             }
             break;
             // ...
         }
     }
 }

1 个答案:

答案 0 :(得分:1)

因为您正在编写凭据提供程序,所以您已经在实现ICredentialProvider接口及其Advise方法:

    virtual HRESULT STDMETHODCALLTYPE Advise( 
        /* [annotation][in] */ 
        _In_  ICredentialProviderEvents *pcpe,
        /* [annotation][in] */ 
        _In_  UINT_PTR upAdviseContext) = 0;

第一个参数是指向事件接口ICredentialProviderEvents的指针,该事件接口只有一个方法:CredentialsChanged。 您的任务是从用户(登录名/密码)获取凭据,并将其存储在内部组件中并调用此方法。 在下一个回合中,您的提供者将被称为此方法:

    virtual HRESULT STDMETHODCALLTYPE GetCredentialCount( 
        /* [annotation][out] */ 
        _Out_  DWORD *pdwCount,
        /* [annotation][out] */ 
        _Out_  DWORD *pdwDefault,
        /* [annotation][out] */ 
        _Out_  BOOL *pbAutoLogonWithDefault) = 0;

您的任务是在pdwDefaultpbAutoLogonWithDefault参数中返回正确的值(我的建议是0TRUE)。 与您的类相比,将ICredentialProviderCredential方法立即调用实现GetSerialization接口。

在这里您可以返回已经存储的凭据。