我在C#中有一个显示窗体的函数。我使用非托管导出公开了该函数,并在命令链接上的凭据提供程序示例中从C调用它。窗体不显示(什么也没发生)。然而,当我使用C控制台应用程序调用同一个C#窗体时,表单显示没有任何问题。2 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();
}
1条答案
按热度按时间wqnecbli1#
试试这个:
调用
ICredentialProviderCredentialEvents::OnCreatingWindow
方法要获取窗口句柄,请将附加参数传递到库中并使用重载方法
ShowDialog
。您可以将
HWND
作为IntPtr
传递出参数valie,并使用公共静态System.Windows.Forms.NativeWindow FromHandle(IntPtr handle)
对其进行转换。