c#调用api报错,string 如何转换为IntPtr
两个问题:
一、"无法将String转换为Ststem.IntPtr" 的问题
调用api函数,原型如下:
[DllImport("kernel32.dll")]
public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,[In, Out] byte[] buffer,UInt32 size,out IntPtr lpNumberOfBytesRead);
c#中如下调用:
ReadProcessMemory(handle, (IntPtr)0x0081B328, tmp_byte, 960, out ptrBytesReaded);
其中第二个参数是个IntPtr类型的内存地址,现在我想在文本框中手工输入类似0x0081B328得地址,然后放入第二个参数进行调用(IntPtr)TextBox1.Text,但是总是报错:无法将String转换为Ststem.IntPtr,请教如何转换
二、"运行库遇到了错误" 的问题
调用api函数,原型如下:
DWORD WINAPI BL_GetText32(LPSTR lpszCurWord,int nBufferSize,LPRECT lpWordRect)
功能:
从内部缓冲区取出单词文本串。对英语文本,该函数最长取出一行内以空格为界的三个英文单词串,遇空格,非英文字母及除‘-’外的标点符号,则终止取词。对汉字文本,该函数最长取出一行汉字串,遇英语字母,标点符号等非汉语字符,则终止取词。该函数不能同时取出英语和汉语字符。
参数:
lpszCurWord
[输入] 目的缓冲区指针。
nBufferSize
[输入] 目的缓冲区大小。
lpWordRect
[输出] 指向 RECT 结构的指针。该结构定义了被取单词所在矩形区域。
返回值:
当前光标在全部词中的位置。
c#中如下调用:
[DllImport("Nhw32.dll", CharSet = CharSet.Auto)]
public static extern string BL_GetText32(string strDest, int count, ref RECT rect);
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
string sb = "";
RECT tmp_rect=new RECT.RECT();
BL_GetText32(sb, 64,ref tmp_rect);
运行报错:
运行库遇到了错误。此错误的地址为 0x7a0a6b30,在线程 0xe78 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。
请高手指点,不胜感激
------解决方案--------------------第一个问题:要把string转换成IntPtr类型的话要用StringToHGlobalAnsi(TextBox1.Text)来转
而倒过来转的话IntPtr转string的话用PtrToStringAnsi(IntPtr)方法来转
------解决方案--------------------同意楼上,这种API调用 LZ可以看看MSDN里面API参数的类型与CLR中类型转换的说明.
------解决方案--------------------第二个问题:C#中的int占的内存大小跟C中的不同,RECT结构修改一下看看:
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public Int16 Left;
public Int16 Top;
public Int16 Right;
public Int16 Bottom;
}
函数原型中的int最好也改为Int16