有关 C# 使用 c++ 的 void* 类型参数的两个问题 ,高手请进.
Ione 2010-06-20 12:04:13 第一个问题 :
如何向 dll 传递 ASP.NET C# 对象 , dll 不使用该对象 , 只是回调时以参数形式返回改对象 . 大概的代码如下
--------------- c++ dll 接口的代码 ----------------
typedef void TCallBackFunction(void *Param);
//Param 为传进来的C#对象
extern "C" __declspec(dllexport) void __stdcall do_callback(TCallBackFunction *callback , void *Param)
{
callback(Param);
}
----------------c# 部分代码 ----------
......
public struct TypeA
{
public System.Web.HttpContext context;
public string otherdata;
}
//定义回调函数类型
delegate void CBF(TypeA obj)
//回调函数
delegate void callbackfunction(TypeA obj)
{
obj.context.Response.Write("call back here.");
obj.context.Response.Write(obj.otherdata);
}
[DllImport("mydll.dll")]
static extern void do_callback([MarshalAs(UnmanagedType.FunctionPtr)] CBF callbackfunc , [MarshalAs(UnmanagedType.LPStruct)] TypeA param);
... ...
//C# 调用的时候
TypeA param = new TypeA();
param.context = this.context;
param.otherdata = "test";
//此处产生异常
do_callback(callback_function , param);
第二个问题 :
dll 中返回 void * 是可变的数据结构 , 不知在c#中如何定义 dll 接口 .
extern "C" __declspec(dllexport) void __stdcall do_callback(int datatype, void *Data)
比如 :
datatype = 0 , Data 是一个 null 结束的字符串 , 相当于 char * buf;
datatype = 1 , Data 是一个 DWORD * 指针 , 相当于 DWORD * rect;
datatype = 2 , Data 是一个 RECT * 指针 , 相当于 RECT * rect;
等等
C# 定义成如下 不知行不 :
[DllImport("mydll.dll")]
static extern void do_callback(int datatype , IntPtr Data);
如果可以 , IntPtr 如何转成别的数据类型 , 特别是转成自定义的结构体 ,比如
public struct mystru
{
public int a;
public string b;
}
c#新手 , 不好意思 ,拜托一下 , 谢谢