您的位置:程序门 -> delphi -> windows sdk/api



api读取资源文件


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


api读取资源文件[已结贴,结贴人:wuhailing]
发表于:2007-03-30 15:30:23 楼主
我把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 ');

发表于:2007-03-30 20:31:451楼 得分:0
直接用delphi自己的对象tresourcestream方便
发表于:2007-03-31 10:03:592楼 得分:0
是的。可是偶想用api实现,继续顶,期待高手出现。
发表于:2007-03-31 10:49:033楼 得分:20
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;


快速检索

最新资讯
热门点击