PAnsiChar和Pointer的数据类型怎么样才能转换为string呢? ( 积分: 100 )

  • 主题发起人 主题发起人 fan2588
  • 开始时间 开始时间
F

fan2588

Unregistered / Unconfirmed
GUEST, unregistred user!
我调用系统API,可是里面的两个参数类型为PAnsiChar和Pointer,我想把这个类型转换为string类型,用了以下方法,怎么出来只是第一个字符:<br>PAnsiChar='ABCD'<br>两种方法转换结果<br>string(PAnsiChar)='A'<br>strpas(PAnsiChar)='A'<br><br>哪个Pointer类型的也是同样的情况,有人知道该怎么做才好?
 
我调用系统API,可是里面的两个参数类型为PAnsiChar和Pointer,我想把这个类型转换为string类型,用了以下方法,怎么出来只是第一个字符:<br>PAnsiChar='ABCD'<br>两种方法转换结果<br>string(PAnsiChar)='A'<br>strpas(PAnsiChar)='A'<br><br>哪个Pointer类型的也是同样的情况,有人知道该怎么做才好?
 
s := StrPas(p); //PChar -&gt; String
 
pchar我试了,可以的,但是这两个类型的怎么都转换不过来的,老是转换出来只有第一个字符<br><br>PAnsiChar='ABCD'<br>两种方法转换结果<br>string(PAnsiChar)='A'<br>strpas(PAnsiChar)='A'
 
//PChar -&gt; String<br>procedure TForm1.Button2Click(Sender: TObject);<br>var<br> &nbsp;p : PAnsiChar;<br> &nbsp;s : string;<br>begin<br> &nbsp;P := 'ABCD';<br> &nbsp;s := StrPas(P);<br> &nbsp;Edit1.Text := s;<br>end;
 
我是做了一个HOOK注册表写入的回调函数,定义了跟API函数RegSetValueExW中同样的参数,但是我得到的lpValueName中的字符串只有注册表写入变化后的第一个字符,其他的怎么出不来呢?<br>function NewRegSetValueExW(hKey: windows.hKey; lpValueName: PAnsiChar; Reserved: DWORD; dwType: DWORD; lpData: Pointer; cbData: DWORD): Longint; stdcall;<br>var<br> &nbsp;str &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : string;<br>begin<br> &nbsp;Hook[fRegSetValueExW].Restore;//恢复HOOK入口<br> &nbsp;if dwType=REG_SZ then//如果是写入字符串类型的话,拦截<br> &nbsp; &nbsp; str:=Strpas(lpValueName);<br> &nbsp;MessageDlg('试图在注册表中写入:'+ str &nbsp;+ '是否允许?', mtWarning, [mbYes, mbNo], 1);<br> &nbsp;end;<br> &nbsp;Hook[fRegSetValueExW].Change;{重新设置HOOK入口,重新截取API}<br>end;
 
最经典的例子<br><br>procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;<br> &nbsp;BufferLength: Word);<br>var<br> &nbsp;S:String;<br>begin<br> &nbsp;SetLength(S,BufferLength);<br> &nbsp;Move(Buffer^,Pchar(S)^,BufferLength);
 
真的是麻烦了,不过还是不行,我测试了下参数里的lpValueName: PAnsiChar;<br>length(lpValueName)=1怎么样的都是等于1,转换后刚好得到的是第一个字符,是不是API函数传过来只传一个地址
 
谢谢大家了,问题解决了<br>是因为PWideChar和PAnsiChar不兼容引起的
 
感谢大家了,我分不是很多,算点点心意好了
 
接受答案了.
 
后退
顶部