如何把ansichar 数组转换为PWideChar?(Delphi2009)(100)

  • 主题发起人 主题发起人 xkdcc
  • 开始时间 开始时间
X

xkdcc

Unregistered / Unconfirmed
GUEST, unregistred user!
如题。(Delphi2009)我的报错代码是:SetString(Result, StrRet.cStr, lStrLen(StrRet.cStr));我尝试使用SetString(Result, StrRet.cStr, lStrLen(PWideChar(StrRet.cStr)));仍然报错:(相关结构和函数:procedure SetString(var s: string
buffer: PChar
len: Integer);//system.pasfunction lstrlen
external kernel32 name 'lstrlenW';Syntax int lstrlen( LPCTSTR lpString );Parameters lpString [in] Pointer to a null-terminated string.Return Value The return value specifies the length of the string, in TCHAR values. This refers to bytes for ANSI versions of the function or WCHAR values for Unicode versions. If lpString is NULL, the return value is 0.StrRet是TStrRet类型。TStrRet的定义如下:type{ record for returning strings from IShellFolder member functions } PSTRRet = ^TStrRet
{$EXTERNALSYM _STRRET} _STRRET = record uType: UINT
{ One of the STRRET_* values } case Integer of 0: (pOleStr: LPWSTR)
{ must be freed by caller of GetDisplayNameOf } 1: (pStr: LPSTR)
{ NOT USED } 2: (uOffset: UINT)
{ Offset into ****EMID (ANSI) } 3: (cStr: array[0..MAX_PATH-1] of AnsiChar)
{ Buffer to fill in }
end
TStrRet = _STRRET;请大侠指教,多谢!
 
一、为什么出错?据说 Delphi 2009 中将所有 API 都定义成基于 Unicode String,就是说 lstrlen 与 lstrlenW 是一回事,这样的话 lstrlen(StrRet.cStr) 就相当于 lstrlenW(StrRet.cStr),要求括号里面是 WideChar 类型,而 StrRet.cStr 是 AnsiChar类型,显然类型不匹配;lstrlen(PWideChar(StrRet.cStr)) 就更离谱了,别说 Delphi 2009,Delphi 3 都通不过,PWideChar(StrRet.cStr) 仍然要求括号里是 WideChar 类型!二、如何修改?Result := StrRet.cStr;不知这么一个简单的操作您为什么非要用 SetString 干什么???如果您特别喜欢这个 SetString 的话,只能重新定义 lstrlen,还原它本来的样子:function lstrlen
external kernel32 name 'lstrlenA'
 
( ⊙o⊙ )哇!楼上貌似不是“纯 Delphi业余爱好者”,但是一定是“纯 Delphi爱好者”!很有见地,我很久没有用Delphi了,这个程序时原来从网上Download来的用来学习的,现在Delphi2009编译通不过,所以在此提问,顺便学习下Delphi2009的Unicode实现。谢谢楼上~~[8D]
 
1、网上的很多代码示例根本没有质量保证,况且人家又不管售后服务,所以有没有问题只能靠您自己的判断...2、Delphi 2009 没用过,看起来很美,用起来不知怎样,估计光是这个 Unicode 就够人受了...3、问题解决后别忘了给分...
 
后退
顶部