两个问题: 
一、"无法将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 的封送处理错误,这些错误可能会损坏堆栈。请高手指点,不胜感激

解决方案 »

  1.   

    第一个问题:要把string转换成IntPtr类型的话要用StringToHGlobalAnsi(TextBox1.Text)来转而倒过来转的话IntPtr转string的话用PtrToStringAnsi(IntPtr)方法来转
      

  2.   

    同意楼上,这种API调用 LZ可以看看MSDN里面API参数的类型与CLR中类型转换的说明.
      

  3.   

    第二个问题:C#中的int占的内存大小跟C中的不同,RECT结构修改一下看看:
      [StructLayout(LayoutKind.Sequential)] 
                    public   struct   RECT 
                    { 
                            public   Int16   Left; 
                            public   Int16   Top; 
                            public   Int16   Right; 
                            public   Int16   Bottom; 
                    } 
    函数原型中的int最好也改为Int16