代码改变世界

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

2009-11-14 16:17  HYrz的菜园子  阅读(571)  评论(0编辑  收藏  举报

最近又犯了一个曾经犯过的错误,在编写一个纯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变量。