Как вызвать форму окна из нативного cpp - PullRequest
0 голосов
/ 02 октября 2009

У меня есть проект, использующий c / c ++ .NET. В настоящее время мне дали задание создать форму окна из моего существующего кода. Поэтому я добавил новое приложение формы окна проекта в существующий c / c ++ projects.form.h, автоматически создается form.cpp. Теперь у меня проблема с вызовом окна из моих файлов c. Даже я не мог вызвать файл form.h из моей программы c. Есть ли решение этой проблемы. Здесь приведена кодировка ....

login.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;    
}

Ответы [ 2 ]

0 голосов
/ 05 октября 2009

спасибо за помощь. Я обнаружил, что моя существующая программа не использует / CLR, но созданная форма Windows использует / CLR. Согласно МСДН: - Внимание! Не смешивайте статические и динамические версии исполняемых библиотек. Наличие в процессе более одной копии библиотек времени выполнения может вызвать проблемы, поскольку статические данные в одной копии не передаются другой копии. Компоновщик не позволяет связывать статические и динамические версии в одном файле .exe, но вы все равно можете получить две (или более) копии библиотек времени выполнения. Например, динамически подключаемая библиотека, связанная со статическими (не DLL) версиями библиотек времени выполнения, может вызвать проблемы при использовании с файлом .exe, который был связан с динамической (DLL) версией библиотек времени выполнения. , (Вам также следует избегать смешивания отладочной и не отладочной версий библиотек в одном процессе.)

0 голосов
/ 02 октября 2009

Вы будете использовать 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...