我有这个函数应该从资源文件中加密字节,但它只是崩溃了我的应用程序:
function crypt(src: Pointer; len: DWORD): DWORD;
var
B: TByteArray absolute src;
index: DWORD;
begin
for index := 0 to len - 1 do
begin
B[index] := B[index] xor 5; //just to test if its working
end;
result := 1;
end;
我正在使用它:
hFind := FindResource(...);
size := SizeOfResource(HInstance, hFind);
hRes :=LoadResource(HInstance, hFind);
bytes :=LockResource(hRes);
crypt(bytes, size);
如果我不打电话给crypt功能程序。我做错了什么?
答案 0 :(得分:4)
您的代码存在两个问题。首先是字节数组,它的元素不包含你的资源数据,而是随你的指针'src'的地址开始的随机数据。使用指向TByteArray的指针,如下所示:
var
B: PByteArray absolute src;
index: DWORD;
begin
for index := 0 to len - 1 do
begin
B^[index] := B^[index] xor 5; //just to test if its working
end;
..
其次,您仍然会尝试修改只读内存段。根据您要执行的操作,您可以在调用'crypt'之前对'bytes'使用VirtualProtect
,或者将内存复制到字节数组并在那里修改它,或者使用BeginUpdateResource
- {{ 1}} - UpdateResource
如果您正在尝试修改资源。
答案 1 :(得分:0)
像这样的代码最容易用这样的指针编写:
function crypt(src: Pointer; len: DWORD): DWORD;
var
B: ^Byte;
index: DWORD;
begin
B := src;
for index := 0 to len - 1 do
begin
B^ := B^ xor 5; //just to test if its working
inc(B);
end;
result := 1;
end;
当然,您确实需要尊重Sertac强调的只读内存问题。我只是添加了这段代码来说明我认为是一种规范的方式来处理作为void指针到达的缓冲区。