PChar和Array [0..255] of Char的区别


本文整理自网络,侵删。

 最近又犯了一个曾经犯过的错误,在编写一个纯API注册机的时候,问题来了。function DialogFunc(hwndDlg: HWND; msg: UINT; wParam: wParam; lParam: lParam): Boolean; stdcall;
var
Name, Email: PChar; //注意这里定义Name和Email为PChar类型
Code: string;
begin
case msg of
WM_INITDIALOG:
begin
InitializeApp(hwndDlg, wParam, lParam);
Result := True;
Exit;
end;
WM_COMMAND:
begin
case (LOWORD(wParam)) of
IDB_GENERATE:
begin
GetDlgItemText(hwndDlg, IDE_NAME, Name, 255); //注意尝试读取Name编辑框的内容
GetDlgItemText(hwndDlg, IDE_MAIL, Email, 255);//注意尝试读取Email编辑框的内容
//以上两者读取的结果都是空。尽管在资源文件里已经为这两个编辑框初始化了内容。
Code := GetSn(Name, Email);
SetDlgItemText(hwndDlg, IDE_CODE, PChar(Code));
Result := True;
Exit;
end;
IDB_EXIT:
begin
EndDialog(hwndDlg, 1);
Result := True;
Exit;
end;
end;
Result := False;
Exit;
end;
WM_CLOSE:
begin
EndDialog(hwndDlg, 0);
Result := True;
Exit;
end;
end;
Result := False;
end;

问题所在,看注释:

GetDlgItemText(hwndDlg, IDE_NAME, Name, 255); //注意尝试读取Name编辑框的内容
GetDlgItemText(hwndDlg, IDE_MAIL, Email, 255);//注意尝试读取Email编辑框的内容
//以上两者读取的结果都是空。尽管在资源文件里已经为这两个编辑框初始化了内容。

但如果把Name和Email的类型定义成 Name:array [0..255] of Char; 类型时,能成功读出编辑框里的内容。

郁闷了一段时间,后来才恍然大悟,原来array[0..255] of Char类型在声明的时候已经为变量分配了内存,而PChar类型只是一个空指针,没有分配内存,因此,尽管GetDlgItemText函数执行成功,但无法把读取到的内容保存到Name或Email内存空间里。

解决办法,除了用上述 array [0..255] of Char 方式定义,如果用PChar,就必须先分配内存,如:

Name, Email:PChar;

SetLength(Name,255);

SetLength(Email,255);

或者:

GetMem(Name,255);

GetMem(Email,255);

然后再能使用Name和Email变量。

相关阅读 >>

Delphi webbrowser用记事本查看源代码

Delphi实现拖动无标题窗口的5种方法

Delphi ifdef 另类用法

Delphi tdatetime 日期时间值的比较

Delphi 2009 中的泛型

Delphi中二进制文件数据存文件方法

Delphi synedit1 synmemo1 显示行号

Delphi xe5 android listview

Delphi10.3通过json.serializers单元对大量数据序列化

Delphi memo1 高亮行的范围

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...