Delphi的开发人员也有粗心的地方吗? ( 积分: 30 )

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

YuZi

Unregistered / Unconfirmed
GUEST, unregistred user!
在ShellAPI单元中:<br>function SHGetFileInfoA(pszPath: PAnsiChar; dwFileAttributes: DWORD;<br> &nbsp;var psfi: TSHFileInfoA; cbFileInfo, uFlags: UINT): DWORD; stdcall;<br>{$EXTERNALSYM SHGetFileInfoW}<br>function SHGetFileInfoW(pszPath: PAnsiChar; dwFileAttributes: DWORD;<br> &nbsp;var psfi: TSHFileInfoW; cbFileInfo, uFlags: UINT): DWORD; stdcall;<br><br>下面的SHGetFileInfoW定义中,参数 pszPath竟然也是: PansiChar型,这样就没法取Unicode路径的文件信息了,是不是弄错了?如果是的话,用什么方式修正比较好?<br>哪位高手来给我确认一下,谢谢!
 
在ShellAPI单元中:<br>function SHGetFileInfoA(pszPath: PAnsiChar; dwFileAttributes: DWORD;<br> &nbsp;var psfi: TSHFileInfoA; cbFileInfo, uFlags: UINT): DWORD; stdcall;<br>{$EXTERNALSYM SHGetFileInfoW}<br>function SHGetFileInfoW(pszPath: PAnsiChar; dwFileAttributes: DWORD;<br> &nbsp;var psfi: TSHFileInfoW; cbFileInfo, uFlags: UINT): DWORD; stdcall;<br><br>下面的SHGetFileInfoW定义中,参数 pszPath竟然也是: PansiChar型,这样就没法取Unicode路径的文件信息了,是不是弄错了?如果是的话,用什么方式修正比较好?<br>哪位高手来给我确认一下,谢谢!
 
谁都有可能出错的地方, 下面是shellapi.h中的定义, 看起来ShellAPI.pas是写错了~ (LPCWSTR = PWideChar)<br><br>SHSTDAPI_(DWORD) SHGetFileInfoW(LPCWSTR pszPath, DWORD dwFileAttributes, SHFILEINFOW FAR *psfi, UINT cbFileInfo, UINT uFlags);
 
麻子兄,我在自己的单元中,重新定义成PWideChar,用起来似乎可以了,您觉得这样可好?
 
它只不过传个指针,没啥对不对的,你拿回来转也可以,改也可以.
 
是的, 指针就是一个32位的变量. (目前如此)
 
但如果用PAnsiChar是得不到unicode字符为名的文件夹内的文件的信息(就是调用失败)<br>而如果用PWideChar却可以成功。不信两位大侠可以试试,比如我有一个这样的文件夹:kkk&amp;yuml;&amp;yuml;
 
就用原来的错误声明来调用:<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>const<br> &nbsp;WsFileName: array[0..8] of Word = ($0043, $003A, $005C, $006B, $006B, $006B, $00FF, $00FF, $0000);<br>var<br> &nbsp;SHFileInfo: TSHFileInfoW;<br>begin<br> &nbsp;MessageBoxW(0, @WsFileName[0], 'Mz', 0);<br><br> &nbsp;SHGetFileInfoW(PChar(@WsFileName[0]), 0, SHFileInfo, SizeOf(SHFileInfo), SHGFI_TYPENAME);<br> &nbsp;ShowMessage(SHFileInfo.szTypeName);<br>end;
 
或者:<br><br>procedure TForm1.Button2Click(Sender: TObject);<br>var<br> &nbsp;WsFileName: WideString;<br> &nbsp;J: Integer;<br> &nbsp;S: string;<br> &nbsp;SHFileInfo: TSHFileInfoW;<br>begin<br> &nbsp;WsFileName := 'C:/kkk'#0#0;<br> &nbsp;WsFileName[7] := #$FF;<br> &nbsp;WsFileName[8] := #$FF;<br> &nbsp;//PDWORD(@WsFileName[7])^ := $00FF00FF;<br><br> &nbsp;MessageBoxW(0, @WsFileName[1], 'Lm', 0);<br><br> &nbsp;S := '';<br> &nbsp;for J := 1 to Length(WsFileName) do<br> &nbsp;begin<br> &nbsp; &nbsp;S := S + '$' + IntToHex(PWord(@WsFileName[J])^, 4) + ', ';<br> &nbsp;end;<br> &nbsp;ShowMessage(S);<br><br> &nbsp;SHGetFileInfoW(PChar(@WsFileName[1]), 0, SHFileInfo, SizeOf(SHFileInfo), SHGFI_TYPENAME);<br> &nbsp;ShowMessage(SHFileInfo.szTypeName);<br>end;
 
试了一下,也可以直接定义:<br>const<br> sFileName: WideString = WideString('C:/kkk') + WideChar($FF) + WideChar($FF);
 
问一句, 楼主是什么版本的Delphi? 在代码编辑窗口中可以输入&quot;&amp;yuml;&quot;这样的符号吗?
 
用的是Delphi7,用下面的语句建的目录,<br>CreateDirectoryW(WideString('f:/kkk')+WideChar($00FF)+WideChar($00FF), nil);
 
var<br> &nbsp;SHFileInfo: TSHFileInfoW;<br> &nbsp;FN : WideString;<br>begin<br> &nbsp;fn := WideString('f:/kkk') + WideChar($00FF) + WideChar($00FF) + '/abc.bat';<br> &nbsp;SHGetFileInfoW(PChar(fn), 0, SHFileInfo, SizeOf(SHFileInfo), SHGFI_TYPENAME);<br> &nbsp;ShowMessage(SHFileInfo.szTypeName);<br><br>郁闷,现在这样也可以了,有一条警告信息,可能是刚才试错了,晕~~~~~~~
 
哦,刚才试的是这样的目录,其实两个函数都不能取得其内的文件的信息,可能试各种情况时,弄晕了<br>f:/recycled/S-1-5-21-1060284298-811497611-11778920086-500/com1.{21ec2020-3aea-1069-a2dd-08002b30309d}/Di1 &nbsp;/kkk&amp;yuml;&amp;yuml;.<br>谢谢麻子兄!谢谢kkyy!
 
后退
顶部