Chạy mã sau trong nền tảng Delphi XE2 Win32 hoạt động. Tuy nhiên, cùng mã biên dịch trong nền tảng win64 sẽ gây ra vi phạm truy cập trong "EnumRCDataProc" nếu chạy trong chế độ gỡ lỗi:Delphi XE2: Gọi WinAPI EnumResourceNames khiến vi phạm truy cập trong nền tảng Win64
procedure TForm2.Button1Click(Sender: TObject);
function EnumRCDataProc(hModule: THandle; lpszType, lpszName: PChar; lParam:
NativeInt): Boolean; stdcall;
begin
TStrings(lParam).Add(lpszName);
Result := True;
end;
var k: NativeInt;
L: TStringList;
H: THandle;
begin
H := LoadPackage('resource.bpl');
L := TStringList.Create;
try
EnumResourceNames(H, RT_RCDATA, @EnumRCDataProc, NativeInt(L));
ShowMessage(L.Text);
finally
L.Free;
UnloadPackage(H);
end;
end;
Khi gỡ lỗi mã trong Delphi XE2 IDE trên nền tảng Win64, tôi thấy giá trị của hModule trong EnumRCDataProc không phù hợp với biến H. Tôi nghi ngờ rằng có thể là một cái gì đó sai về các thông số tôi xây dựng cho EnumRCDataProc. Tuy nhiên, tôi không thể hiểu được làm thế nào. Ý tưởng nào?
Trình biên dịch không nên phàn nàn về điều đó. Hàm enum cục bộ không phải là vấn đề gì cả. – OnTheFly
Đoán, tại sao nó phát ra rằng: p – OnTheFly
Miễn là cuộc gọi lại không truy cập bất kỳ điều mẫu nào không phải là vấn đề. Sau đó, một lần nữa, với mục đích đó, việc gọi lại là điều chính xác. Có nghĩa là gì? Điều đó có làm mất hiệu lực một phần của câu trả lời ở trên không? –