读书人

API读取资源文件解决思路

发布时间: 2012-02-29 16:44:10 作者: rapoo

API读取资源文件
我把DLL编绎成资源文件包含在EXE中,EXE运行时自动还原DLL并进行调用。

R.rec
-------------------------------------------------
MYDLL DLLFILE A.DLL


//释放资源文件
procedure ResourceToFile(FileName:pChar);
var
hResInfo:HRSRC;
hResData:HGLOBAL;
dwSize,dwWritten:DWORD;
hFile:THANDLE;
pl: PByte;
begin
hResInfo := FindResource(HInstance, 'MYDLL ', 'DLLFILE ');
if (hResInfo <> 0) then
begin
dwSize := SizeofResource(HInstance,hResInfo);
hResData := LoadResource(HInstance,hResinfo);
pl := LockResource(hResData);
if(hResData <> 0) then
begin
hFile := CreateFile(FileName,GENERIC_WRITE,0,nil,CREATE_ALWAYS,0,0);
WriteFile(hFile,pl,dwSize,dwWritten,nil);
CloseHandle(hFile);
end;
end;
end;

//EXE中调用出错,A.DLL释放后是零字节。
ResourceToFile( 'a.dll ');



[解决办法]
procedure ExtractRes(ResType, ResName, ResNewName: string);
// TODO -cMM: ExtractRes 释放资源
var
HResInfo: THandle;
HGlobal: THandle;
FMemory: Pointer;
FSize: Longint;
handle: THandle;
Wsize: longword;
procedure SetPointer(Ptr: Pointer; Size: Longint);
begin
FMemory := Ptr;
FSize := Size;
end;
function Initialize(Instance: THandle; Name, ResType: PChar): boolean;
begin
result := false;
HResInfo := FindResource(Instance, Name, ResType);
if HResInfo = 0 then Exit;
HGlobal := LoadResource(Instance, HResInfo);
if HGlobal = 0 then Exit;
SetPointer(LockResource(HGlobal), SizeOfResource(Instance, HResInfo));
result := true;
end;
begin
if not Initialize(hInstance, PChar(ResName), PChar(ResType)) then exit;
if fileexists(ResNewName) then Deletefile(pchar(ResNewName));
try
handle := Integer(CreateFile(PChar(ResNewName), GENERIC_READ or

GENERIC_WRITE,
0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0));
WriteFile(Handle, FMemory^, FSize, Wsize, nil);
CloseHandle(handle);
except
end;
UnlockResource(HGlobal);
FreeResource(HGlobal);
end;

读书人网 >.NET

热点推荐