2012-07-31 4 views
2

지금 도움이 필요합니다. 누군가가 내 QT 기반 코드를 "C# 응용 프로그램에서 작동하도록"전송하는 것을 도울 수 있다면 정말 좋을 것입니다.Qt 관리되지 않는 C++ 클래스가 C# .Net과 함께 작동합니다.

내가이 간단한 QT 클래스가 있다고 가정하자 :

class ItShouldWork : public QObject 
{ 
    Q_OBJECT 

public: 
    ItShouldWork(QObject* parent = 0) : QObject(parent){} 
    QString id() const { return objectName(); } 

}; 

가 지금은 비주얼 스튜디오 C#을이 클래스에 액세스 할 수 있도록하려면, 나는 래퍼를 통해 관리되지 않는 DLL 및 액세스를 만들려고 시도했습니다 COM 구성 요소를 만들지 만 지금은 완전히 멈춰서이 간단한 클래스로 시작합니다. 나는이 같은 당신이 __declspec (dllexport)과 통근 "C"를 사용할 수있는 본 적이 :

extern "C" __declspec(dllexport) double Subtract(double a, double b) 

을 다음 .NET에서 _dllImport를 사용,이 위의 기능이 잘 작동하지만, 예 A QString에 대한 추가 할 때 그것에 더 이상 내 dll을 인식하지 못하고 dllNotFoundException이 발생합니다.

그런 다음 어쩌면 당신은 어떤 종류의 래퍼가 필요하다고 생각했습니다. 그렇다면 어떻게해야합니까? 봤지만 멀리 정말 C + + 및 Qt 기능 날 도와 아무것도.

dll과 c-wrapper를 만드는 방법이나 COM 구성 요소 dll을 직접 작성하는 방법에 대한 단계별 설명이 정말 멋지 겠지만, 실제로 어떻게 처리되었는지는 신경 쓰지 않지만 방법을 알고 있다면 도와주세요. 작은 자습서? 나는 미치겠 어 ...

+0

'QString'은'QT' 프레임 워크에 고유합니다. 'QString' 클래스를 일반적인'String' 클래스로 변환하기 위해 w 래퍼를 닫아야합니다. –

+0

@Rambound 어떻게 할 수 있습니까? 래퍼 내 말은, QString을 char *로 변환하는 방법은 문제가 아니어야합니다. –

답변

2

C++/CLI가가는 길입니다. 참조 : 특히 Wrapping unmanaged C++ with C++/CLI - a proper approach

그리고 : http://www.delmarlearning.com/companions/content/1592009638/bonus/009638_BonusCh02.pdf

을 깊이 그 주제에가는 것은 포럼 게시물에서 할 쉬운 일이 아니다. 그러나 약간의 연구를 통해 당신은 아주 빠르게 유용한 것을 만들어 낼 수 있어야합니다. C/C++에서오고 있다면 C++/CLI가 익숙해 져 있습니다. 좀 더 제한적입니다. 특히 관리되는 유형과 관리되지 않는 유형을 혼합 할 때 특히 그렇습니다. 그러나 문학은 거기에서 당신을 안내 할 것입니다.

편집이 : 내 대답에 영업 이익의 의견에 대응하여 (또한 Ramhound 날에 의해 설명 참조) , 여기에 내가 here있어 예입니다 는 m_impl의 컨텍스트를 볼 수있는 링크 뒤에 내용에서보세요. ..

String^CSimpleObjectWrapper::ToString(void) 
{ 
    wchar_t szStr[100]; 
    HRESULT hr = m_impl->ToString(szStr, ARRAYSIZE(szStr)); 
    if (FAILED(hr)) 
    { 
     Marshal::ThrowExceptionForHR(hr); 
    } 
    // Marshal PWSTR to System::String and return it. 
    return gcnew String(szStr); 
} 

편집 2 : 는 또한 래퍼의 원하는 깊이/복잡성/성능에 따라, 당신은 C++/CLI에서 "심판 클래스"말이지 클래스를 포장하는 대신 같이 DllImport를 사용하는 방법에 대해 생각할 수 있습니다.

+0

링크를 살펴본 결과, 어떻게 작동하는지 조금 더 이해할 수 있습니다. 다른 문제로 들어간 C++/CLI 솔루션을 사용하는 경우 __declspec (dllexport)가 QT 변수와 함께 작동하는 방식입니다 (예 :이 함수). __declspec (dllexport) QString getId(); DllImport를 통해 액세스하려고하면 dllNotFoundException이 항상 발생합니다. 그런 다음 제거하고 일반 C 함수 만 있으면 정상적으로 발견됩니다. –

+0

글쎄, "가정 __declspec (dllexport) QString getId();" 함수 래퍼, 당신이 내보내는거야 : 제 의견으로는 QString을 함수 래퍼의 다른 문자열 유형으로 변환해야합니다. 그렇지 않으면 언급 한 것과 같은 문제에 직면하게 될 것입니다. –

+0

C++/CLI는 모노로 지원되지 않으므로이 솔루션을 사용하는 모든 솔루션은 크로스 플랫폼이 아닙니다. – trampster

1

Managed C++에서 래퍼를 만들 수 있습니다. 그러면 C#에서 관리되는 클래스를 사용할 수 있습니다. 이것을 확인하십시오, 당신을 도울 것입니다 http://msdn.microsoft.com/en-us/library/ms235638.aspx

+0

Managed C++가 사용되지 않지만 좋은 답변입니다. –

+0

왜 관리되는 C++가 사용되지 않을 것입니까? 출처? – tobsen

+2

@tobsen 잘, 축약 된 expr. managed C++는 "Managed Extensions for C++"의 약자입니다. 그건 분명히 비추입니다. [여기, 첫 문장] (http://en.wikipedia.org/wiki/Managed_Extensions_for_C%2B%2B) 및 [여기에도 VS에 대한 지원이 제거되었습니다] (http://msdn.microsoft.com /en-us/library/b23b94s7(v=vs.90).aspx) 예를 들어. 현재 표준은 C++/CLI로 ECMA 비준을 받았습니다. [Bjarne Stroustup의 웹 사이트] (http://www.stroustrup.com/bs_faq.html#CppCLI)도 참조하십시오. –

1

http://doc.qt.nokia.com/4.7-snapshot/activeqt-dotnet.html을 살펴보십시오. 그것은 ActiveQT을 사용하는 방법에 대한 몇 가지 정보를 가지고있는 웹 사이트 당 :

Qt의 액티브 X 및 COM 지원은 윈도우 개발자를위한 Qt를 할 수 있습니다 : 액세스 및 ActiveX 컨트롤과 Qt는 응용 프로그램에서 어떤 ActiveX 서버에서 제공하는 COM 객체를 사용 . 자신의 Qt 응용 프로그램을 을 COM 서버로 사용할 수 있도록합니다. Qt 개체 및 위젯의 수는 COM 개체 및 ActiveX 컨트롤입니다.

이 페이지에는 .Net과 통합하는 방법에 대한 예제도 있습니다.

+0

감사합니다.이 페이지는 많은 도움이되었고 이제는 com 구성 요소를 성공적으로 만들었습니다. –

+0

@SimonNielsen 도움이 되니 기쁩니다. 이 게시물 중 하나라도 귀하의 질문에 답변 한 경우 해당 질문에 답변으로 표시하여 동일한 문제가있는 다음 사람이 적절한 답변을 찾을 수 있도록하십시오. 귀하의 질문에 도움이되는 정보 또는 대안 답변을 제공하는 답변을 upvote하는 것도 좋은 예절입니다. –

관련 문제