pchar,pansichar在SHFileOperation中的使用疑问 (50分)

  • 主题发起人 主题发起人 YoungSun
  • 开始时间 开始时间
Y

YoungSun

Unregistered / Unconfirmed
GUEST, unregistred user!
我看到许多人都提到在SHFileOperation中,TSHFileOpStruct中的from参数必须以#0#0结尾,<br>但是我在使用时,发现有时需要,而有时又不需要,有些糊涂,请大家帮忙解释一下,下面<br>是两个使用例子:<br>要#0#0的:<br>
代码:
<br>//------------------------------------------------<br>// sShare - 源路径<br>procedure TformClient.DownloadFile(sShare: string);<br>var<br>&nbsp; sFrom,sTo : AnsiString;<br>&nbsp; Fo &nbsp; &nbsp; &nbsp; &nbsp;: TSHFileOpStruct;<br>&nbsp; msg,sPath : string;<br>begin<br>&nbsp; if SelectDirectory('','',sPath) then<br>&nbsp; &nbsp; &nbsp;sFrom &nbsp; &nbsp; := AnsiString(sShare+#0#0); // 必须加#0#0<br>&nbsp; &nbsp; &nbsp;sTo &nbsp; &nbsp; &nbsp; := AnsiString(sPath);<br>&nbsp; &nbsp; &nbsp;Fo.Wnd &nbsp; &nbsp;:= Handle;<br>&nbsp; &nbsp; &nbsp;Fo.wFunc &nbsp;:= FO_COPY;<br>&nbsp; &nbsp; &nbsp;Fo.pFrom &nbsp;:= PAnsiChar(sFrom);<br>&nbsp; &nbsp; &nbsp;Fo.pTo &nbsp; &nbsp;:= PAnsiChar(sTo);<br>&nbsp; &nbsp; &nbsp;Fo.fFlags := 0;<br>&nbsp; &nbsp; &nbsp;if SHFileOperation(Fo) = 0 then<br>&nbsp; &nbsp; &nbsp; &nbsp; msg:= 'ok!'<br>&nbsp; &nbsp; &nbsp;else<br>&nbsp; &nbsp; &nbsp; &nbsp; msg:= 'error:'+SysErrorMessage(GetLastError());<br>&nbsp; &nbsp; &nbsp;MessageBox(handle,pchar(msg),'Title',MB_OK+MB_ICONWARNING);<br>&nbsp; end;<br>end;<br>
<br>不要#0#0的:<br>
代码:
<br>procedure TformClient.DownloadFile();<br>var<br>&nbsp; sFrom &nbsp; &nbsp; : String;<br>&nbsp; Fo &nbsp; &nbsp; &nbsp; &nbsp;: TSHFileOpStruct;<br>&nbsp; msg,sPath : string;<br>begin<br>&nbsp; if SelectDirectory('','',sPath) then<br>&nbsp; &nbsp; &nbsp;sFrom &nbsp; &nbsp; := 'D:/temp/icon';<br>&nbsp; &nbsp; &nbsp;Fo.Wnd &nbsp; &nbsp;:= Handle;<br>&nbsp; &nbsp; &nbsp;Fo.wFunc &nbsp;:= FO_COPY;<br>&nbsp; &nbsp; &nbsp;Fo.pFrom &nbsp;:= PChar(sFrom);<br>&nbsp; &nbsp; &nbsp;Fo.pTo &nbsp; &nbsp;:= PChar(sPath);<br>&nbsp; &nbsp; &nbsp;Fo.fFlags := 0;<br>&nbsp; &nbsp; &nbsp;if SHFileOperation(Fo) = 0 then<br>&nbsp; &nbsp; &nbsp; &nbsp; msg:= 'ok!'<br>&nbsp; &nbsp; &nbsp;else<br>&nbsp; &nbsp; &nbsp; &nbsp; msg:= 'error:'+SysErrorMessage(GetLastError());<br>&nbsp; &nbsp; &nbsp;MessageBox(handle,pchar(msg),'Title',MB_OK+MB_ICONWARNING);<br>&nbsp; end;<br>end;<br>
<br>上面,后一个既可以用string,也可以用ansistring,并且直接用pchar转换就可以了,但<br>前一个就不行,必须用ansistring,并在后面加#0#0,请大家帮忙解释一下其中究竟。
 
好歹说两句吧。
 
默认情况下 string 就是 AnsiString :-)
 
前面一个,是用的字符串变量,你需要在后面加 #0 那没说的,应该地<br>后面一个用的字符串常量,我怀疑是系统自动在后面补了两个 #0<br>
 
这个函数的路径后面必须有2个0,
 
我刚才看了一下,字符串常量的末尾有 3 个 #0 !(系统自动加的)<br>你说,还需要你去加吗?:)
 
to beta:<br>//默认情况下 string 就是 AnsiString<br>能不能说说什么时候不同呢?(我也是重庆的哦[:)])<br><br>总结一下,就是说关键在于当使用字符串变量时,必须在后面加#0#0,而使用字符串常量时<br>不需要,而不在于是string还是ansistring以及pchar和pansichar,对吗?
 
我现在是知道其然而不知道其所以然。
 
多人接受答案了。
 
////默认情况下 string 就是 AnsiString<br>//能不能说说什么时候不同呢?(我也是重庆的哦)<br>编译开关的 Huge String 为 False 的时候
 
后退
顶部