Winforms 如何从本机cpp调用windows窗体

Winforms 如何从本机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,

我有一个使用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,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文件一起使用时可能会导致问题。您还应该避免在一个进程中混合库的调试版本和非调试版本