作者AdamHsu (AdamHsu)
看板C_Sharp
标题[问题] 也许这是一个unsafe的问题吧
时间Thu Feb 21 23:39:33 2008
诸位大大,小弟在写一个程式
程式中要Invoke一个DLL的函数(这个DLL没有Source Code)
由於自DLL呼叫的Function需要几个参数,其中一个参数的类型是void *
但如大大们所知,C#并没有支援Point,要想使用Point必须在unsafe的情况之
下有限度的有限度的使用.但是,小弟一直会遇到一个Exception.告诉小弟
程式执行呼叫该DLL Function时记忆体存取错误.
小弟想问的是,在C#中是否可以传送void*(不可以为NULL)给某一个DLL的Function当作
他的参数.如果不行,那诸位大大是如何解决的呢.
以下是小弟我的程式片断,大大们如果觉得有可以改进的地方,也望不吝指正.
// 部份struct即宣告小弟先行掠过,指po部份重要的
// 所有程式均设成unsafe
// 以下是DLLImport的主要宣告
[DllImport(dllName, CharSet = CharSet.Ansi, CallingConvention =
CallingConvention.Cdecl)]
public static unsafe extern Int32 query_ex(void* session_handle,
ref Int32 TStatus, UInt32 Type, message* Buffer,
sbyte BFlag, void* RBuffer, ref UInt32 RBuffer_Length,
ref UInt32 TID, ref UInt32 ORID);
// 以下是RBuffer使用前的处里,其他部分的参数碍於篇幅先行掠过
IntPtr ptr1 = Marshal.AllocHGlobal(64000);
void* RBuffer;
RBuffer = ptr1.ToPointer();
// 跑到下面这一行时,都会发生Exception
// 经过检查是RBuffer的问题(此栏位不可为NULL,必须传入void*或是char*)
// 但一传进去执行就有Exception
Int32 ii = query_ex(Handle, ref glTStatus, glFType_EP0,
queryMessage, BFlag, RBuffer, ref RLen,
ref TID, ref ORID);
// 发生的exception都是描述记忆体存取错误
///////////////////////////////////////////////////////////////////////
QQQ
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.118.162.142