首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

API读取资源文件解决思路

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

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;

热点排行