【问题标题】:How to call windows form from native cpp如何从本机 cpp 调用 windows 窗体
【发布时间】:2009-10-02 07:42:10
【问题描述】:

我有一个使用 c/c++ .NET 的现有项目。目前,我的任务是从我现有的代码创建一个 Windows 窗体。 所以我在现有的 c/c++ projects.form.h 中添加了新的项目 windows 窗体应用程序,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;    
}

【问题讨论】:

    标签: winforms interop


    【解决方案1】:

    您将使用 COM 将 .NET 代码公开给 C++ 代码:

    1。 用 COM 属性标记您要公开的接口:

    [ComVisible(true)]
    [Guid("5CBA864C-C063-4a47-2344-56AE016ABEE3")]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IExposedInterface
    {
        void ShowForm();
    }
    

    2。 使用 COM 属性标记您要公开的实现:

    [ComVisible(true)]
    [Guid("BE337127-0DF7-2344-AD66-2338FE3926D8")]
    [ProgId("NETAssembly.ExposedInterface")]
    public sealed class ExposedInterface : IExposedInterface
    {
    }
    

    3。 使用 regasm.exe 生成 tlb 文件: regasm.exe /tlb:NETAssembly.tlb NETAssembly.dll

    4。 在 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;
    }
    

    【讨论】:

      【解决方案2】:

      感谢您的帮助。 我发现我现有的程序没有使用 /CLR,但创建的 Windows 窗体正在使用 /CLR。 根据msdn:- 注意不要混合运行库的静态和动态版本。在一个进程中拥有多个运行时库副本可能会导致问题,因为一个副本中的静态数据不与另一个副本共享。链接器会阻止您在一个 .exe 文件中同时链接静态和动态版本,但您仍然可以得到运行时库的两个(或更多)副本。例如,与运行时库的静态(非 DLL)版本链接的动态链接库在与运行时库的动态 (DLL) 版本链接的 .exe 文件一起使用时可能会导致问题. (您还应该避免在一个进程中混合调试和非调试版本的库。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-14
        • 2020-08-23
        • 2022-01-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多