总结:
1.参数传递
网址 :http://www.pinvoke.net/
2. 接口调用
3.this is not com
更新中。。。。。。。。。。。。。
1.参数传递
@param [in] ellipsoid 指针
@param [in] prj 指针
@param [in] uPnts 数组指针
@param [in] count 简单类型
@param [in] blCoords 传出数组指针
extern "C" GEO_API void __stdcall GaussProjInvert(const Ellipsoid* ellipsoid, const Prj* prj, const UPnt* uPnts, int count, BLCoord* blCoords);
[DllImport("Geo.dll",CallingConvention = CallingConvention.StdCall)]
static extern void GaussProj(ref Ellipsoid ellipsoid, ref Prj prj, BLCoord[] blCoords, int count, [Out] UPnt[] uPnts);
@param [in] prj 指针
@param [in] uPnts 数组指针
@param [in] count 简单类型
@param [in] blCoords 传出数组指针
extern "C" GEO_API void __stdcall GaussProjInvert(const Ellipsoid* ellipsoid, const Prj* prj, const UPnt* uPnts, int count, BLCoord* blCoords);
[DllImport("Geo.dll",CallingConvention = CallingConvention.StdCall)]
static extern void GaussProj(ref Ellipsoid ellipsoid, ref Prj prj, BLCoord[] blCoords, int count, [Out] UPnt[] uPnts);
网址 :http://www.pinvoke.net/
2. 接口调用
#ifndef __HEADER_DLL__
#define __HEADER_DLL__
#include < windows.h >
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
#endif // __HEADER_DLL__
#ifndef __HEADER_INTIMPL_DLL__
#define __HEADER_INTIMPL_DLL__
#include " Int.h "
namespace Dll
{
class IntImp : public Int, public Int1, public Int2
{
public:
IntImp(int val);
virtual int Sub(int a);
virtual int Mul(int a);
virtual bool GetInterface(void** pptr, int iid);
virtual void Delete();
int val;
};
}
#endif // __HEADER_INTIMPL_DLL__
#ifndef __HEADER_INT_DLL__
#define __HEADER_INT_DLL__
#include " Dll.h "
namespace Dll
{
class Int
{
public:
virtual bool GetInterface(void** pptr, int iid) = 0;
virtual void Delete() = 0;
};
class Int1
{
public:
virtual int Sub(int a) = 0;
};
class Int2
{
public:
virtual int Mul(int b) = 0;
};
extern "C" DLL_API Int* __stdcall CreateInt(int a);
extern "C" DLL_API void __stdcall InvokeIntDelete(Int* in);
extern "C" DLL_API void __stdcall InvokeIntGetInterface(Int* in, void** pptr, int iid);
extern "C" DLL_API int __stdcall InvokeInt1Sub(Int1* in, int a);
extern "C" DLL_API int __stdcall InvokeInt2Mul(Int2* in, int a);
}
#endif // __HEADER_INT_DLL__
#include " IntImpl.h "
namespace Dll
{
IntImp::IntImp(int val)
{
this->val = val;
}
int IntImp::Sub(int a)
{
return this->val-a;
}
int IntImp::Mul(int a)
{
return this->val*a;
}
bool IntImp::GetInterface(void** pptr, int iid)
{
bool res = false;
if ( iid == 1 )
{
*pptr = (Int1*)this;
res = true;
}
else if ( iid == 2 )
{
*pptr = (Int2*)this;
res = true;
}
return res;
}
void IntImp::Delete()
{
delete this;
}
extern "C" DLL_API Int* __stdcall CreateInt(int a)
{
return new IntImp(a);
}
extern "C" DLL_API void __stdcall InvokeIntDelete(Int* in)
{
in->Delete();
}
extern "C" DLL_API void __stdcall InvokeIntGetInterface(Int* in, void** pptr, int iid)
{
in->GetInterface(pptr, iid);
}
extern "C" DLL_API int __stdcall InvokeInt1Sub(Int1* in, int a)
{
return in->Sub(a);
}
extern "C" DLL_API int __stdcall InvokeInt2Mul(Int2* in, int a)
{
return in->Mul(a);
}
}
using System;
using System.Runtime.InteropServices;
namespace DLL
{
public class Wrapper
{
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr CreateInt(int a);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int InvokeIntDelete(IntPtr pPtr);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern bool InvokeIntGetInterface(IntPtr ptr, [Out] IntPtr[] pPtr, int iid);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int InvokeInt1Sub(IntPtr pPtr, int a);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int InvokeInt2Mul(IntPtr pPtr, int a);
}
public class Int
{
private IntPtr target;
public Int( int a )
{
target = Wrapper.CreateInt(a);
}
public object GetInterface( int iid )
{
IntPtr[] pPtr = new IntPtr[1];
if ( Wrapper.InvokeIntGetInterface( target, pPtr, iid) && iid == 1 )
{
return new Int1(pPtr[0]);
}
if ( Wrapper.InvokeIntGetInterface( target, pPtr, iid) && iid == 2 )
{
return new Int2(pPtr[0]);
}
return null;
}
public void Delete()
{
Wrapper.InvokeIntDelete(target);
}
}
public class Int1
{
private IntPtr target;
public Int1( IntPtr target )
{
this.target = target;
}
public int Sub(int a)
{
return Wrapper.InvokeInt1Sub(target, a);
}
}
public class Int2
{
private IntPtr target;
public Int2( IntPtr target )
{
this.target = target;
}
public int Mul(int a)
{
return Wrapper.InvokeInt2Mul(target, a);
}
}
}
#define __HEADER_DLL__
#include < windows.h >
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
#endif // __HEADER_DLL__
#ifndef __HEADER_INTIMPL_DLL__
#define __HEADER_INTIMPL_DLL__
#include " Int.h "
namespace Dll
{
class IntImp : public Int, public Int1, public Int2
{
public:
IntImp(int val);
virtual int Sub(int a);
virtual int Mul(int a);
virtual bool GetInterface(void** pptr, int iid);
virtual void Delete();
int val;
};
}
#endif // __HEADER_INTIMPL_DLL__
#ifndef __HEADER_INT_DLL__
#define __HEADER_INT_DLL__
#include " Dll.h "
namespace Dll
{
class Int
{
public:
virtual bool GetInterface(void** pptr, int iid) = 0;
virtual void Delete() = 0;
};
class Int1
{
public:
virtual int Sub(int a) = 0;
};
class Int2
{
public:
virtual int Mul(int b) = 0;
};
extern "C" DLL_API Int* __stdcall CreateInt(int a);
extern "C" DLL_API void __stdcall InvokeIntDelete(Int* in);
extern "C" DLL_API void __stdcall InvokeIntGetInterface(Int* in, void** pptr, int iid);
extern "C" DLL_API int __stdcall InvokeInt1Sub(Int1* in, int a);
extern "C" DLL_API int __stdcall InvokeInt2Mul(Int2* in, int a);
}
#endif // __HEADER_INT_DLL__
#include " IntImpl.h "
namespace Dll
{
IntImp::IntImp(int val)
{
this->val = val;
}
int IntImp::Sub(int a)
{
return this->val-a;
}
int IntImp::Mul(int a)
{
return this->val*a;
}
bool IntImp::GetInterface(void** pptr, int iid)
{
bool res = false;
if ( iid == 1 )
{
*pptr = (Int1*)this;
res = true;
}
else if ( iid == 2 )
{
*pptr = (Int2*)this;
res = true;
}
return res;
}
void IntImp::Delete()
{
delete this;
}
extern "C" DLL_API Int* __stdcall CreateInt(int a)
{
return new IntImp(a);
}
extern "C" DLL_API void __stdcall InvokeIntDelete(Int* in)
{
in->Delete();
}
extern "C" DLL_API void __stdcall InvokeIntGetInterface(Int* in, void** pptr, int iid)
{
in->GetInterface(pptr, iid);
}
extern "C" DLL_API int __stdcall InvokeInt1Sub(Int1* in, int a)
{
return in->Sub(a);
}
extern "C" DLL_API int __stdcall InvokeInt2Mul(Int2* in, int a)
{
return in->Mul(a);
}
}
using System;
using System.Runtime.InteropServices;
namespace DLL
{
public class Wrapper
{
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr CreateInt(int a);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int InvokeIntDelete(IntPtr pPtr);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern bool InvokeIntGetInterface(IntPtr ptr, [Out] IntPtr[] pPtr, int iid);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int InvokeInt1Sub(IntPtr pPtr, int a);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int InvokeInt2Mul(IntPtr pPtr, int a);
}
public class Int
{
private IntPtr target;
public Int( int a )
{
target = Wrapper.CreateInt(a);
}
public object GetInterface( int iid )
{
IntPtr[] pPtr = new IntPtr[1];
if ( Wrapper.InvokeIntGetInterface( target, pPtr, iid) && iid == 1 )
{
return new Int1(pPtr[0]);
}
if ( Wrapper.InvokeIntGetInterface( target, pPtr, iid) && iid == 2 )
{
return new Int2(pPtr[0]);
}
return null;
}
public void Delete()
{
Wrapper.InvokeIntDelete(target);
}
}
public class Int1
{
private IntPtr target;
public Int1( IntPtr target )
{
this.target = target;
}
public int Sub(int a)
{
return Wrapper.InvokeInt1Sub(target, a);
}
}
public class Int2
{
private IntPtr target;
public Int2( IntPtr target )
{
this.target = target;
}
public int Mul(int a)
{
return Wrapper.InvokeInt2Mul(target, a);
}
}
}
#ifndef __HEADER_ENTITY_DLL__
#define __HEADER_ENTITY_DLL__
#include " Dll.h "
namespace Dll
{
const int DLL_ENTITY = 0x0;
class Entity
{
public:
virtual bool QueryInterface(void** pptr, int iid) = 0;
virtual void AddRef() = 0;
virtual void Release() = 0;
};
const int DLL_ADDENTITY = 0x01;
class AddEntity : public Entity
{
public:
virtual int Add(int dest) = 0;
};
const int DLL_SUBENTITY = 0x02;
class SubEntity : public Entity
{
public:
virtual int Sub(int dest) = 0;
};
const int DLL_MULENTITY = 0x03;
class MulEntity : public Entity
{
public:
virtual int Mul(int dest) = 0;
};
extern "C" DLL_API AddEntity* __stdcall CreateAddEntity(int val);
extern "C" DLL_API SubEntity* __stdcall CreateSubEntity(int val);
extern "C" DLL_API MulEntity* __stdcall CreateMulEntity(int val);
extern "C" DLL_API int __stdcall Invoke_AddEntity_Add(AddEntity* entity, int dest);
extern "C" DLL_API int __stdcall Invoke_SubEntity_Sub(SubEntity* entity, int dest);
extern "C" DLL_API int __stdcall Invoke_MulEntity_Mul(MulEntity* entity, int dest);
extern "C" DLL_API bool __stdcall Invoke_Entity_QueryInterface(Entity* entity, void** pPtr, int iid);
extern "C" DLL_API void __stdcall Invoke_Entity_AddRef(Entity* entity);
extern "C" DLL_API void __stdcall Invoke_Entity_Release(Entity* entity);
}
#endif // __HEADER_ENTITY_DLL__
#ifndef __HEADER_ENTITYIMPL_DLL__
#define __HEADER_ENTITYIMPL_DLL__
#include " Entity.h "
namespace Dll
{
class EntityImpl : public AddEntity, public SubEntity, public MulEntity
{
public:
EntityImpl(int val);
virtual bool QueryInterface(void** pptr, int iid);
virtual void AddRef();
virtual void Release();
virtual int Add(int dest);
virtual int Sub(int dest);
virtual int Mul(int dest);
int val;
int refCount;
};
}
#endif // __HEADER_ENTITYIMPL_DLL__
#include " EntityImpl.h "
namespace Dll
{
EntityImpl::EntityImpl(int val)
{
this->val = val;
refCount = 0;
}
bool EntityImpl::QueryInterface(void** pptr, int iid)
{
bool res = false;
switch( iid )
{
case DLL_ENTITY :
{
*pptr = (AddEntity*)this;
res = true;
}
break;
case DLL_ADDENTITY :
{
*pptr = (AddEntity*)this;
res = true;
}
break;
case DLL_SUBENTITY :
{
*pptr = (SubEntity*)this;
res = true;
}
break;
case DLL_MULENTITY :
{
*pptr = (MulEntity*)this;
res = true;
}
break;
default:
break;
}
return res;
}
void EntityImpl::AddRef()
{
++refCount;
}
void EntityImpl::Release()
{
--refCount;
if ( refCount == 0)
{
delete this;
}
}
int EntityImpl::Add(int dest)
{
return val+dest;
}
int EntityImpl::Sub(int dest)
{
return val-dest;
}
int EntityImpl::Mul(int dest)
{
return val*dest;
}
extern "C" DLL_API AddEntity* __stdcall CreateAddEntity(int val)
{
return (AddEntity*)new EntityImpl(val);
}
extern "C" DLL_API SubEntity* __stdcall CreateSubEntity(int val)
{
return (SubEntity*)new EntityImpl(val);
}
extern "C" DLL_API MulEntity* __stdcall CreateMulEntity(int val)
{
return (MulEntity*)new EntityImpl(val);
}
extern "C" DLL_API int __stdcall Invoke_AddEntity_Add(AddEntity* entity, int dest)
{
return entity->Add(dest);
}
extern "C" DLL_API int __stdcall Invoke_SubEntity_Sub(SubEntity* entity, int dest)
{
return entity->Sub(dest);
}
extern "C" DLL_API int __stdcall Invoke_MulEntity_Mul(MulEntity* entity, int dest)
{
return entity->Mul(dest);
}
extern "C" DLL_API bool __stdcall Invoke_Entity_QueryInterface(Entity* entity, void** pPtr, int iid)
{
return entity->QueryInterface(pPtr, iid);
}
extern "C" DLL_API void __stdcall Invoke_Entity_AddRef(Entity* entity)
{
entity->AddRef();
}
extern "C" DLL_API void __stdcall Invoke_Entity_Release(Entity* entity)
{
entity->Release();
}
}
using System;
using System.Runtime.InteropServices;
namespace DLL
{
public class Wrapper
{
public const int DLL_ENTITY = 0x0;
public const int DLL_ADDENTITY = 0x01;
public const int DLL_SUBENTITY = 0x02;
public const int DLL_MULENTITY = 0x03;
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr CreateAddEntity(int val);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr CreateSubEntity(int val);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr CreateMulEntity(int val);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern bool Invoke_Entity_QueryInterface(IntPtr ptr, [Out] IntPtr[] pPtr, int iid);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int Invoke_Entity_AddRef(IntPtr pPtr);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int Invoke_Entity_Release(IntPtr pPtr);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int Invoke_AddEntity_Add(IntPtr pPtr, int a);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int Invoke_SubEntity_Sub(IntPtr pPtr, int a);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int Invoke_MulEntity_Mul(IntPtr pPtr, int a);
}
public class Entity
{
protected IntPtr target;
public Entity( IntPtr target )
{
this.target = target;
}
public object GetInterface( int iid )
{
IntPtr[] pPtr = new IntPtr[1];
object obj = null;
if ( Wrapper.Invoke_Entity_QueryInterface(target, pPtr, iid) )
{
switch ( iid )
{
case Wrapper.DLL_ENTITY :
obj = new Entity(pPtr[0]);
break;
case Wrapper.DLL_ADDENTITY :
obj = new AddEntity(pPtr[0]);
break;
case Wrapper.DLL_SUBENTITY :
obj = new SubEntity(pPtr[0]);
break;
case Wrapper.DLL_MULENTITY :
obj = new MulEntity(pPtr[0]);
break;
default :
break;
}
}
return obj;
}
public void AddRef()
{
Wrapper.Invoke_Entity_AddRef(target);
}
public void Release()
{
Wrapper.Invoke_Entity_Release(target);
}
}
public class SubEntity : Entity
{
public SubEntity( IntPtr target ) : base(target)
{
}
public SubEntity( int val ) : base(IntPtr.Zero)
{
this.target = Wrapper.CreateSubEntity(val);
}
public int Sub(int a)
{
return Wrapper.Invoke_SubEntity_Sub(target, a);
}
}
public class AddEntity : Entity
{
public AddEntity( IntPtr target ) : base(target)
{
}
public AddEntity( int val) : base(IntPtr.Zero)
{
this.target = Wrapper.CreateAddEntity(val);
}
public int Add(int a)
{
return Wrapper.Invoke_AddEntity_Add(target, a);
}
}
public class MulEntity : Entity
{
public MulEntity( IntPtr target ) : base(target)
{
}
public MulEntity( int val ) : base(IntPtr.Zero)
{
this.target = Wrapper.CreateMulEntity(val);
}
public int Mul(int a)
{
return Wrapper.Invoke_MulEntity_Mul(target, a);
}
}
}
#define __HEADER_ENTITY_DLL__
#include " Dll.h "
namespace Dll
{
const int DLL_ENTITY = 0x0;
class Entity
{
public:
virtual bool QueryInterface(void** pptr, int iid) = 0;
virtual void AddRef() = 0;
virtual void Release() = 0;
};
const int DLL_ADDENTITY = 0x01;
class AddEntity : public Entity
{
public:
virtual int Add(int dest) = 0;
};
const int DLL_SUBENTITY = 0x02;
class SubEntity : public Entity
{
public:
virtual int Sub(int dest) = 0;
};
const int DLL_MULENTITY = 0x03;
class MulEntity : public Entity
{
public:
virtual int Mul(int dest) = 0;
};
extern "C" DLL_API AddEntity* __stdcall CreateAddEntity(int val);
extern "C" DLL_API SubEntity* __stdcall CreateSubEntity(int val);
extern "C" DLL_API MulEntity* __stdcall CreateMulEntity(int val);
extern "C" DLL_API int __stdcall Invoke_AddEntity_Add(AddEntity* entity, int dest);
extern "C" DLL_API int __stdcall Invoke_SubEntity_Sub(SubEntity* entity, int dest);
extern "C" DLL_API int __stdcall Invoke_MulEntity_Mul(MulEntity* entity, int dest);
extern "C" DLL_API bool __stdcall Invoke_Entity_QueryInterface(Entity* entity, void** pPtr, int iid);
extern "C" DLL_API void __stdcall Invoke_Entity_AddRef(Entity* entity);
extern "C" DLL_API void __stdcall Invoke_Entity_Release(Entity* entity);
}
#endif // __HEADER_ENTITY_DLL__
#ifndef __HEADER_ENTITYIMPL_DLL__
#define __HEADER_ENTITYIMPL_DLL__
#include " Entity.h "
namespace Dll
{
class EntityImpl : public AddEntity, public SubEntity, public MulEntity
{
public:
EntityImpl(int val);
virtual bool QueryInterface(void** pptr, int iid);
virtual void AddRef();
virtual void Release();
virtual int Add(int dest);
virtual int Sub(int dest);
virtual int Mul(int dest);
int val;
int refCount;
};
}
#endif // __HEADER_ENTITYIMPL_DLL__
#include " EntityImpl.h "
namespace Dll
{
EntityImpl::EntityImpl(int val)
{
this->val = val;
refCount = 0;
}
bool EntityImpl::QueryInterface(void** pptr, int iid)
{
bool res = false;
switch( iid )
{
case DLL_ENTITY :
{
*pptr = (AddEntity*)this;
res = true;
}
break;
case DLL_ADDENTITY :
{
*pptr = (AddEntity*)this;
res = true;
}
break;
case DLL_SUBENTITY :
{
*pptr = (SubEntity*)this;
res = true;
}
break;
case DLL_MULENTITY :
{
*pptr = (MulEntity*)this;
res = true;
}
break;
default:
break;
}
return res;
}
void EntityImpl::AddRef()
{
++refCount;
}
void EntityImpl::Release()
{
--refCount;
if ( refCount == 0)
{
delete this;
}
}
int EntityImpl::Add(int dest)
{
return val+dest;
}
int EntityImpl::Sub(int dest)
{
return val-dest;
}
int EntityImpl::Mul(int dest)
{
return val*dest;
}
extern "C" DLL_API AddEntity* __stdcall CreateAddEntity(int val)
{
return (AddEntity*)new EntityImpl(val);
}
extern "C" DLL_API SubEntity* __stdcall CreateSubEntity(int val)
{
return (SubEntity*)new EntityImpl(val);
}
extern "C" DLL_API MulEntity* __stdcall CreateMulEntity(int val)
{
return (MulEntity*)new EntityImpl(val);
}
extern "C" DLL_API int __stdcall Invoke_AddEntity_Add(AddEntity* entity, int dest)
{
return entity->Add(dest);
}
extern "C" DLL_API int __stdcall Invoke_SubEntity_Sub(SubEntity* entity, int dest)
{
return entity->Sub(dest);
}
extern "C" DLL_API int __stdcall Invoke_MulEntity_Mul(MulEntity* entity, int dest)
{
return entity->Mul(dest);
}
extern "C" DLL_API bool __stdcall Invoke_Entity_QueryInterface(Entity* entity, void** pPtr, int iid)
{
return entity->QueryInterface(pPtr, iid);
}
extern "C" DLL_API void __stdcall Invoke_Entity_AddRef(Entity* entity)
{
entity->AddRef();
}
extern "C" DLL_API void __stdcall Invoke_Entity_Release(Entity* entity)
{
entity->Release();
}
}
using System;
using System.Runtime.InteropServices;
namespace DLL
{
public class Wrapper
{
public const int DLL_ENTITY = 0x0;
public const int DLL_ADDENTITY = 0x01;
public const int DLL_SUBENTITY = 0x02;
public const int DLL_MULENTITY = 0x03;
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr CreateAddEntity(int val);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr CreateSubEntity(int val);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr CreateMulEntity(int val);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern bool Invoke_Entity_QueryInterface(IntPtr ptr, [Out] IntPtr[] pPtr, int iid);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int Invoke_Entity_AddRef(IntPtr pPtr);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int Invoke_Entity_Release(IntPtr pPtr);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int Invoke_AddEntity_Add(IntPtr pPtr, int a);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int Invoke_SubEntity_Sub(IntPtr pPtr, int a);
[DllImport("Dll.dll",CallingConvention = CallingConvention.StdCall)]
public static extern int Invoke_MulEntity_Mul(IntPtr pPtr, int a);
}
public class Entity
{
protected IntPtr target;
public Entity( IntPtr target )
{
this.target = target;
}
public object GetInterface( int iid )
{
IntPtr[] pPtr = new IntPtr[1];
object obj = null;
if ( Wrapper.Invoke_Entity_QueryInterface(target, pPtr, iid) )
{
switch ( iid )
{
case Wrapper.DLL_ENTITY :
obj = new Entity(pPtr[0]);
break;
case Wrapper.DLL_ADDENTITY :
obj = new AddEntity(pPtr[0]);
break;
case Wrapper.DLL_SUBENTITY :
obj = new SubEntity(pPtr[0]);
break;
case Wrapper.DLL_MULENTITY :
obj = new MulEntity(pPtr[0]);
break;
default :
break;
}
}
return obj;
}
public void AddRef()
{
Wrapper.Invoke_Entity_AddRef(target);
}
public void Release()
{
Wrapper.Invoke_Entity_Release(target);
}
}
public class SubEntity : Entity
{
public SubEntity( IntPtr target ) : base(target)
{
}
public SubEntity( int val ) : base(IntPtr.Zero)
{
this.target = Wrapper.CreateSubEntity(val);
}
public int Sub(int a)
{
return Wrapper.Invoke_SubEntity_Sub(target, a);
}
}
public class AddEntity : Entity
{
public AddEntity( IntPtr target ) : base(target)
{
}
public AddEntity( int val) : base(IntPtr.Zero)
{
this.target = Wrapper.CreateAddEntity(val);
}
public int Add(int a)
{
return Wrapper.Invoke_AddEntity_Add(target, a);
}
}
public class MulEntity : Entity
{
public MulEntity( IntPtr target ) : base(target)
{
}
public MulEntity( int val ) : base(IntPtr.Zero)
{
this.target = Wrapper.CreateMulEntity(val);
}
public int Mul(int a)
{
return Wrapper.Invoke_MulEntity_Mul(target, a);
}
}
}
更新中。。。。。。。。。。。。。