AnsiString PWideChar类型转换问题

iqyely 2009-04-05 08:11:27
function DecodeProductKey(const HexSrc: array of BYTE): pchar;stdcall;
const
StartOffset: INTEGER = $34;
EndOffset: INTEGER = $34 + 15;
Digits: array[0..23] of CHAR = ('B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', 'Q', 'R', 'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9');
dLen: INTEGER = 29;
sLen: INTEGER = 15;
var
HexDigitalPID: array of CARDINAL;
Des: array of CHAR;
I, N: INTEGER;
HN, Value: CARDINAL;
begin
SetLength(HexDigitalPID, dLen);
for I := StartOffset to EndOffset do
begin
HexDigitalPID[I - StartOffSet] := HexSrc[I];
end;

SetLength(Des, dLen + 1);

for I := dLen - 1 downto 0 do
begin
if (((I + 1) mod 6) = 0) then
begin
Des[I] := '-';
end
else
begin
HN := 0;
for N := sLen - 1 downto 0 do
begin
Value := (HN SHL 8) or HexDigitalPID[N];
HexDigitalPID[N] := value div 24;
HN := Value mod 24;
end;
Des[I] := Digits[HN];
end;
end;
Des[dLen] := Chr(0);

for I := 0 to Length(Des) do
begin
Result := Result + Des[I];{在delphi2009下该句出错,提示[DCC Error] OperatingSystem.pas(55): E2010 Incompatible types: 'AnsiString' and 'PWideChar',请您帮忙看看,这个类型要怎么转换呢?}
end;
end;
...全文
455 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jadeluo 2009-04-05
  • 打赏
  • 举报
回复
修改成这样:

procedure DecodeProductKey(const HexSrc: array of BYTE; Des: PChar); stdcall;
const
StartOffset: INTEGER = $34;
EndOffset: INTEGER = $34 + 15;
Digits: array[0..23] of CHAR = ('B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', 'Q', 'R', 'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9');
dLen: INTEGER = 29;
sLen: INTEGER = 15;
var
HexDigitalPID: array of CARDINAL;
I, N: INTEGER;
HN, Value: CARDINAL;
begin
SetLength(HexDigitalPID, dLen);
for I := StartOffset to EndOffset do
begin
HexDigitalPID[I - StartOffSet] := HexSrc[I];
end;

for I := dLen - 1 downto 0 do
begin
if (((I + 1) mod 6) = 0) then
begin
Des[I] := '-';
end
else begin
HN := 0;
for N := sLen - 1 downto 0 do
begin
Value := (HN SHL 8) or HexDigitalPID[N];
HexDigitalPID[N] := value div 24;
HN := Value mod 24;
end;
Des[I] := Digits[HN];
end;
end;
Des[dLen] := #0;
end;


调用时的代码:

var
S: String;
......
begin
SetLength(S, 30);
DecodeProductKey(..., PChar(S));
end;
jadeluo 2009-04-05
  • 打赏
  • 举报
回复
不建议编写返回值类型为PChar的函数, 因为这样写的话, PChar所占空间由谁创建、由谁释放将变得很难处理:如果由函数来分配,则函数返回时不能释放该空间,否则将导致调用者获得一个指向未分配空间的PChar指针,而函数返回时不释放该空间,则将导致内存泄漏。

一般的做法是:把PChar返回值作为函数的一个变量传入函数,空间的分配和释放由调用者负责。
iqyely 2009-04-05
  • 打赏
  • 举报
回复
这个函数原先的返回值是string,可我想把它放在dll里调用,就改成了pansichar,现在把Result := Result + Des[I];改成Result := pansichar(Result + Des[I]);后,在返回的正确的结果里又有了很多的乱码。这个该怎么解决下呢?
手指风 2009-04-05
  • 打赏
  • 举报
回复
PChar的赋值请使用StrPCopy
手指风 2009-04-05
  • 打赏
  • 举报
回复
你的返回结果是PChar,它是一个指针,所以你直接用Result := Result + Des[I];操作是不行的,delphi应该是把结果当成String来处理了,所以Result + Des[I];得到的是String,无法赋值给一个PChar,对于返回是PChar的函数一般不要直接采用直接以PChar来返回,而应该把返回值作为一个参数,调用者先负责分配内存,调用后不需要时释放,否则你必须在你的函数里分配内存,而且必须单独再提供释放内存的函数.

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧