【问题标题】:Form not displaying in credential provider表单未显示在凭据提供程序中
【发布时间】:2019-02-04 13:59:18
【问题描述】:

我在 C# 中有一个显示表单的函数。我已经使用 Unmanaged Exports 公开了该函数,并在命令链接上的凭据提供程序示例中从 C++ 调用它。表单不显示(没有任何反应)。但是,当我使用 C++ 控制台应用程序调用相同的 C# 表单时,该表单显示没有任何问题。 C++ 控制台应用程序正在加载它但 C++ 凭据提供程序代码没有加载它可能有什么区别?

C++ 代码:

using CSharpForm = void(__stdcall *)(wchar_t* message);
int _tmain(int argc, _TCHAR* argv[])
{
HMODULE mod = LoadLibraryA("CSharp.dll");
CSharpForm form = reinterpret_cast<CSharpForm>(GetProcAddress(mod, "form1"));
form(L"This is a c# form");
getchar();
return 0;
}

C#代码:

[DllExport(ExportName = "form1", CallingConvention = CallingConvention.StdCall)]
public static void showForm([MarshalAs(UnmanagedType.LPWStr)]string message)
{
    Form_Test form = new Form_Test();
    form.Text = message;
    form.ShowDialog();
}

【问题讨论】:

    标签: c# c++ forms credential-providers unmanagedexports


    【解决方案1】:

    试试这个:

    调用ICredentialProviderCredentialEvents::OnCreatingWindow方法

    HRESULT OnCreatingWindow(
        HWND *phwndOwner
    );
    

    要获取窗口句柄,请将附加参数传递到您的库中并使用重载方法ShowDialog

    public DialogResult ShowDialog(
        IWin32Window owner
    );
    

    【讨论】:

    • 谢谢。我应该如何将句柄传递给 C# 代码?比如,要接收字符串,我在 c# 中执行“[MarshalAs(UnmanagedType.LPWStr)]string message”。我将如何编组句柄?
    • 您可以将HWND 传递为IntPtr ant 并使用public static System.Windows.Forms.NativeWindow FromHandle (IntPtr handle); 转换它
    • 看看这个post
    • 非常感谢。它现在正在工作!我会标记那个答案。再次感谢
    • 还有一件事,如果我使用 Show(owner) 而不是 ShowDialog(owner) 以便代码在显示表单后向前移动,可以这样做吗?因为当我这样做时,表单无法正确显示(它变得无法点击并挂起)
    猜你喜欢
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多