delphi 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 让程序自己更新本程序

Delphi读写文本文件 assignfile reset append

Delphi10.3 创建一条json数据

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

Delphi ado的事务处理例子

Delphi 打开资源管理器并定位到指定目录下的文件

Delphi的cpu调试窗口

Delphi来实现全屏截图

Delphi 中showmodal与show的区别

Delphi 解决strtodatetime()不是有效日期类型的问题

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



打赏

取消

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

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

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

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

评论

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