2009-07-14 30 views
0

ネイティブC++からManaged C++への多数の.hおよび.libファイルの移植に取り組んでおり、最終的にはC#で参照される.dllとして使用されます。ネイティブC++からマネージC++へのC#

.NETにすべてのものを移植するのはずっと簡単ですが、もしできれば可能ですか?それはサードパーティーで、私が持っているのは.lib(エクスポートなし)と.hファイルです。

仮想機能を使用するまではすべてがスムーズに進みましたが、現在は代議員の問題が発生しています。私は取得していますエラーの中で

は以下のとおりです。

エラーC3756: 'ThreadFunc':既存のシンボルで定義の競合を委任
エラーC2079: 'MyWrapTest :: MyThreadWrap :: m_threadAttrは、' 未定義のクラスを使用しています'MyWrapTest :: MyThreadAttrWrap' エラーC2664: 'MyWrapTest :: AutoPtr :: AutoPtr(T *)':からパラメータ1を変換することはできません 'MyWrapTest :: MyThreadAttrWrap'

'MyThread *' に明確にするために、Iネイティブコードと、私が作業しているものを含めるw。まず、ネイティブコード:

#ifndef MYTHREAD_HPP 
#define MYTHREAD_HPP 

#ifdef WIN32 
#include <winsock2.h> 
#include <windows.h> 
#define STDCALL unsigned __stdcall 
typedef unsigned (__stdcall *ThreadFunc)(void*); 
#else 
#define STDCALL void* 
typedef void* (*ThreadFunc)(void*); 
typedef unsigned int HANDLE ; 
#endif 
#include "generaltypes.hpp" 

class MyThreadAttr; 

class MyThread 
{ 
public: 
    MyThread(void); 
    MyThread(MyThreadAttr * tta); 
    virtual ~MyThread() {}; 
    virtual HANDLE start(ThreadFunc,void *, unsigned *); 
    virtual int stop(); 
    static void wait(HANDLE); 
#ifdef WIN32 
    static void wait(HANDLE, int);// msec timeout required since 'cancelThread' is no-op 
#endif        
    static void sleep(unsigned int); 
    static int32 cancelThread(HANDLE hThread); // no-op on Windows (returns -1)! 
#ifndef WIN32 
    static void setCancelStates(void); 
    static void endProcess(); 
#endif 

protected: 
    MyThreadAttr * m_threadAttr; 
    void setThreadAttr(MyThreadAttr * tta); 
}; 

#endif 

AND NEW STUFFは、私が開発しています:あなたは再びコンストラクタでm_NativeMyThreadを定義するのはなぜ

#pragma once 

#ifdef WIN32 
#include <winsock2.h> 
#include <windows.h> 
#define STDCALL unsigned __stdcall 
//typedef unsigned (__stdcall ThreadFunc)(Object^); 
#else 
#define STDCALL Object^ 
typedef unsigned int HANDLE; 
#endif 
#include "gentypes.hpp" 
#include "AutoPtr.h" 
#include "MyThread.hpp" 

using namespace System; 
using namespace System::Runtime::InteropServices; 

namespace MyWrapTest 
{ 

public delegate Object^ ThreadFunc(Object^ o); 

ref class MyThreadAttrWrap; 
//#include "MyThreadAttrWrap.h" 

public ref class MyThreadWrap 
{ 
public: 
    MyThreadWrap(void) 
    { 
     AutoPtr<MyThread> m_NativeMyThread(new MyThread); 
    }; 
    MyThreadWrap(MyThreadAttrWrap tta) 
    { 
     AutoPtr<MyThread> m_NativeMyThread(tta); 
    }; 
    /*virtual ~MyThreadWrap(){}; 
    virtual HANDLE start(ThreadFunc,System::Object^, unsigned ^); 
    virtual int stop();*/ 
    static void wait(HANDLE h) 
    { 
     m_NativeMyThread->wait(h); 
    }; 
#ifdef WIN32 
    static void wait(HANDLE h, int i) // msec timeout required since 'cancelThread' is no-op 
    { 
     m_NativeMyThread->wait(h, i); 
    }; 
#endif        
    static void sleep(unsigned int i) 
    { 
     m_NativeMyThread->sleep(i); 
    }; 
    static int32 cancelThread(HANDLE hThread); // no-op on Windows (returns -1)! 
#ifndef WIN32 
    static void setCancelStates(void); 
    static void endProcess(); 
#endif 

protected: 
    MyThreadAttrWrap m_threadAttr; 
    void setThreadAttr(MyThreadAttrWrap tta); 


private: 
    AutoPtr<MyThread> m_NativeMyThread; 
}; 
} 
+0

あなたのコードをすべてハイライトし、メニュー上部の0101ボタンを押してください。 – jkeys

答えて

0

- これは、ローカル変数、あなたはおそらくこれをたくなる:

MyThreadWrap() 
    : m_NativeMyThread(new MyThread) 
{ 
}; 

それとも

MyThreadWrap() 
{ 
    m_NativeMyThread = AutoPtr<MyThread>(new MyThread); 
}; 

私は通常、.Netを使用しないので、AutoPtrのセマンティクスについてはわかりませんが、ローカルオブジェクトのシャドウを作成せずにメンバオブジェクトを変更したいとします。

ここでは、AutoPtr型の新しいローカルオブジェクトを作成し、MyThreadAttrWrap型の1つの引数を渡します。 MyThreadWrap(MyThreadAttrWrap tta) { AutoPtr m_NativeMyThread(tta); };

は何がしたいことに渡されたMyThreadAttrWrapから抽出したアンマネージドMyThreadAttr *オブジェクトで構築された新しいMyThreadオブジェクトとm_NativeMyThreadを初期化することである(私は、.NETは物事を混乱させるなら、私を修正し、C++のようにそれを読んでいます)コンストラクタに渡します。

MyThreadWrap(MyThreadAttrWrap tta) 
{ 
    m_NativeMyThread = AutoPtr<MyThread>(new MyThread(tta.GetNativeAttr())); 
}; 

ご存知のとおり、オーナーシップについては非常に注意してください。投稿したコードから、MyThreadがMyThreadAttrを所有しているかどうか、またはMyThreadAttrが外部で所有されているかどうかは不明です。 AutoPtrは囲まれたポインタを所有しています(正しく名前が付けられている場合)。

0

ユージン、

ありがとう。長い一日の後には、疲れた目が大好きです。間違った型を宣言しているAutoPtrを使用していました。

ネイティブスレッドオブジェクトの「シャドウコピー」に関しては、ネイティブオブジェクト管理が.NETで正しく行われていることを確認するために、Microsoftが推奨する十分に文書化された方法に従っていました。

MSDN Article

デリゲートの問題も同様に疲れた目に関連していました。 Delegate Nameを変更して、既存の(ネイティブの)関数が新しいデリゲートと同じスペースに存在することを可能にする必要がありました。

私はまだフォワード宣言にいくつか問題がありますが、私はすぐにそれをクリアできると確信しています。

関連する問題