2

今、助けが必要です。誰かが私のC#アプリケーションで動作するように私のQTベースのコードを「転送」するのを手伝ってくれるといいのですが。

私がこの単純なQTクラスを持っているとしましょう:

class ItShouldWork : public QObject
{
    Q_OBJECT

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

};

Visual Studio C#でこのクラスにアクセスできるようにしたいので、アンマネージdllを作成してラッパーを介してアクセスし、COMコンポーネントを作成しようとしましたが、今は完全にスタックしているため、に戻ります。この単純なクラスから始まります。次のように__declspec(dllexport)でextern"C"を使用できることを確認しました。

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

次に、.netで_dllImportを使用します。これは上記の関数で正常に機能しますが、たとえばQStringを追加すると、dllが認識されなくなり、dllNotFoundExceptionがスローされます。

それから私は多分あなたが何かの種類のラッパーが必要だと思いました、ええ、そしてあなたはそれをどのように行うのですか..?グーグルで離れましたが、c++とqtの関数で本当に役立つものは何もありません。

dllとc-wrapperを作成する方法、またはCOMコンポーネントdllを直接作成する方法を少しずつ説明します。どのように実行するかはあまり気にしませんが、方法を知っている場合は、小さなチュートリアルを手伝ってください。私はおかしくなりそうだ...

4

3 に答える 3

2

C ++/CLIがその方法だと思います。参照:アンマネージC++をC++/CLIでラップする-適切なアプローチ

特に:http ://www.delmarlearning.com/companions/content/1592009638/bonus/009638_BonusCh02.pdf

その主題を深く掘り下げることは、フォーラムの投稿で行うのは簡単ではありません。しかし、いくつかの研究により、非常に迅速に使用できるものを作成できるはずです。C / C ++を使用している場合、C ++/CLIには多少の慣れが必要です。特にマネージドタイプとアンマネージドタイプの混合に関しては、もう少し制限があります。しかし、文献はそこにあなたを導きます。

編集:私の答えに対するOPのコメント(Ramhound、Meによるコメントも参照)に応えて、ここに私が得た例があります:リンクの後ろのコンテンツを見て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:また、ラッパーの必要な深さ/複雑さ/パワーに応じて、DllImportを使用する代わりに、クラスをC ++/CLIの「refクラス」でラップすることを検討する場合があります。

于 2012-07-31T16:43:05.153 に答える
1

ManagedC++でラッパーを作成できます。その後、C#でマネージドクラスを使用できるようになります。これを確認してください。http://msdn.microsoft.com/en-us/library/ms235638.aspxに役立つ可能性があります。

于 2012-07-31T16:34:30.733 に答える
1

http://doc.qt.nokia.com/4.7-snapshot/activeqt-dotnet.htmlをご覧ください。ActiveQTの使用に関する情報があり、Webサイトごとに次のようになっています。

QtのActiveXおよびCOMサポートにより、QtforWindows開発者は次のことが可能になります。Qtアプリケーションで任意のActiveXサーバーによって提供されるActiveXコントロールおよびCOMオブジェクトにアクセスして使用する。QtアプリケーションをCOMサーバーとして利用できるようにし、任意の数のQtオブジェクトとウィジェットをCOMオブジェクトとActiveXコントロールとして使用できるようにします。

このページには、.Netと統合する方法の例もあります。

于 2012-07-31T17:44:04.067 に答える