日期:2014-05-18  浏览次数:21182 次

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