本文整理自网络,侵删。
最近又犯了一个曾经犯过的错误,在编写一个纯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 2010下使用sqlitesimpleDelphi连接sqlite数据库及中文乱码问题的解决
Delphi用idtcpserver和idtcpclient传输文件
Delphi simple resource api replacement
Delphi windows 编程[11] - wm_size 消息
更多相关阅读请进入《Delphi》频道 >>