2009-07-14 46 views
0

我正在从本地C++移植大量的.h和.lib文件到托管C++作为C#中引用的.dll最终使用。本机C++托管C++到C#

请问,我知道将整个东西移植到.NET会容易得多,但如果我能的话。这是第三方,我所有的.lib(无导出)和.h文件可以使用。

一切都一直顺利,直到我打虚拟功能,现在我有一些代表问题。

在我得到的错误是:

错误C3756: '的ThreadFunc':委托定义冲突与现有的符号
错误C2079: 'MyWrapTest :: MyThreadWrap :: m_threadAttr' 使用未定义类'MyWrapTest :: MyThreadAttrWrap' 错误C2664: 'MyWrapTest :: AutoPtr :: AutoPtr(T *)':不能从 'MyWrapTest :: MyThreadAttrWrap' 转换参数1至 'MyThread的*'

为了清楚起见,我将包括本机代码和我正在处理的内容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 

和新的东西,我正在开发:

#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 2009-07-14 22:57:03

回答

0

你为什么再次构造定义m_NativeMyThread - 这使得局部变量,你可能想这一点:

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

或者

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

我通常不使用.Net,所以我不确定AutoPtr的语义,但是你想改变你的成员对象,而不是创建一个本地阴影。

至于错误,在这里您创建一个新的AutoPtr类型的本地对象并将其传递给MyThreadAttrWrap类型的一个参数。 MyThreadWrap(MyThreadAttrWrap tta) { AutoPtr m_NativeMyThread(tta); }; (我读它作为C++,纠正我,如果净混淆的东西)

你想要的是与不同之处是从在通过MyThreadAttrWrap提取非托管MyThreadAttr *对象构造的新MyThread的对象初始化m_NativeMyThread到你的构造函数。

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

顺便说一句,要非常小心所有权。从您发布的代码中,不清楚MyThread是否拥有MyThreadAttr,或者它是否属于外部。 AutoPtr拥有它的封闭指针(如果它的名字正确)。

0

尤金,

感谢您的意见。经过漫长的一天之后,爱上了疲惫的眼睛。 AutoPtr声明了错误的类型,这是正确的。

至于本地线程对象的“影子副本”,我确实遵循了Microsoft建议的一个记录良好的练习,以确保本机对象管理在.NET中正确完成。

MSDN Article

的委托问题涉及疲惫的眼睛为好。我需要更改委托名称以允许现有(本地)功能与新委托存在于相同的空间中。

我仍然有一些问题与前瞻性声明,但我敢肯定我可以很快清除。