Winforms 如何从本机cpp调用windows窗体
我有一个使用c/c++.NET的现有项目。目前,我的任务是从现有代码创建windows窗体。 因此,我在现有的c/c++项目中添加了新的project windows窗体应用程序。form.h、form.cpp已自动创建。 现在我无法从我的c文件调用窗口。 甚至我也不能从我的c程序中调用form.h文件。 这个问题有什么解决办法吗。 这里列出的是编码 登录.cWinforms 如何从本机cpp调用windows窗体,winforms,interop,Winforms,Interop,我有一个使用c/c++.NET的现有项目。目前,我的任务是从现有代码创建windows窗体。 因此,我在现有的c/c++项目中添加了新的project windows窗体应用程序。form.h、form.cpp已自动创建。 现在我无法从我的c文件调用窗口。 甚至我也不能从我的c程序中调用form.h文件。 这个问题有什么解决办法吗。 这里列出的是编码 登录.c int LoginMain(int id,int task) { LoginClear(); LoginEntry(id,
int LoginMain(int id,int task)
{
LoginClear();
LoginEntry(id,task);
dp_in = 1;
Rep();
//I WOULD LIKE TO CALL THE FORM AT THIS STAGE
Cashier();
dp_in = 0;
Login();
return(0);
}
form.cpp
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
// Enabling Windows XP visual effects before any controls are created
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
// Create the main window and run it
Application::Run(gcnew Form1());
return 0;
}
你将使用COM将.NET代码暴露为C++代码:
一,。 使用COM属性标记要公开的接口:[ComVisible(true)]
[Guid("5CBA864C-C063-4a47-2344-56AE016ABEE3")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IExposedInterface
{
void ShowForm();
}
[ComVisible(true)]
[Guid("BE337127-0DF7-2344-AD66-2338FE3926D8")]
[ProgId("NETAssembly.ExposedInterface")]
public sealed class ExposedInterface : IExposedInterface
{
}
二,。
使用COM属性标记要公开的实现:
[ComVisible(true)]
[Guid("5CBA864C-C063-4a47-2344-56AE016ABEE3")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IExposedInterface
{
void ShowForm();
}
[ComVisible(true)]
[Guid("BE337127-0DF7-2344-AD66-2338FE3926D8")]
[ProgId("NETAssembly.ExposedInterface")]
public sealed class ExposedInterface : IExposedInterface
{
}
三,。
使用regasm.exe生成tlb文件:
regasm.exe/tlb:NETAssembly.tlb NETAssembly.dll
四,。
在C代码中:
#include "stdafx.h"
#include <atlimage.h>
#import "NETAssembly.tlb" named_guids
int _tmain(int argc, _TCHAR* argv[])
{
// Initialize COM.
CoInitialize(NULL);
NETAssembly::IExposedInterfacePtr pIExposedInterface;
HRESULT hr = pIExposedInterface.CreateInstance(NETAssembly::CLSID_IExposedInterface);
pIExposedInterface->ShowForm()
// Release object.
pIExposedInterface = NULL;
// Uninitialize COM.
CoUninitialize();
return 0;
}
谢谢你的帮助。
我发现我现有的程序没有使用/CLR,但创建的windows窗体使用的是/CLR。
根据msdn:-
注意:不要混合使用运行时库的静态版本和动态版本。一个进程中有多个运行时库副本可能会导致问题,因为一个副本中的静态数据不会与另一个副本共享。链接器阻止您在一个.exe文件中同时链接静态和动态版本,但您仍然可以得到运行时库的两个或多个副本。例如,与运行时库的静态非DLL版本链接的动态链接库与与运行时库的动态DLL版本链接的.exe文件一起使用时可能会导致问题。您还应该避免在一个进程中混合库的调试版本和非调试版本