代码如下:procedure OutRes(ResName:pChar;ResType:pChar;FileName:pChar);   
//参数说明:   
//ResName为资源文件里的名称   
//ResType为资源文件里的类型名   
//FileName为释放资源文件的路径   
var  
  hResInfo:HRSRC;   
  hResData:HGLOBAL;   
  dwSize,dwWritten:DWORD;   
  hFile:THANDLE;   
  //dwBuf:array[1..65535] of char;   
  dwBuf:Pointer;   
begin  
  hResInfo := FindResource(0 ,ResName,ResType);   
   if (hResInfo <> 0) then  
    begin  
      dwSize := SizeofResource(0,hResInfo);   
      hResData:= LoadResource(0,hResinfo);   
      if(hResData <> 0) then  
        begin  
            hFile := CreateFile(FileName,GENERIC_WRITE,0,nil,CREATE_ALWAYS,0,0 );   
            if(hFile <> 0) then  
            begin  
                dwBuf:=LockResource(hResData);      //锁资源   
                if(WriteFile(hFile,dwBuf,dwSize,dwWritten,nil)) then  
                    CloseHandle(hFile);   
            end;   
        end;   
        FreeResource(hResData);   
    end;   
end; 这段代码是利用API进行资源文件的释放的,由于要控制文件的大小,所以不能使用Delphi提供的TResourceStream方法,该方法必须引用Classes单元,这样会使程序扩大好几百K,很不可取。资源释放其实完全可以依靠API实现,而经我分析,TResourceStream方法也基本上是适用以上的思路实现的,只不过它用一些方法封装了一些细节,使之使用更加方便了而已。 这段代码从思路上来说完全没有问题,并且据我测试,FindResource能够找到资源句柄,SizeofResource返回的资源大小完全正确,LoadResource也能够正确读取并返回,CreateFile的执行也是成功的,LockResource也能够返回一个不为空的指针,问题似乎就在于最后的这个WriteFile上,但困扰我的地方就是在这,我实在是找不出问题到底是出在哪里了,最终释放出来的文件是一个0字节大小的文件。这到底是怎么回事呢?请诸位大哥们帮帮我,这个问题我已经折腾了一个多星期了,实在是没辙了。我谢谢你们了。

解决方案 »

  1.   

    WriteFile返回成功了吗?CloseHandle执行了吗?
      

  2.   

    用这个
    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;