找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 3068|回复: 10

[求助]delphi下通过wimgapi.dll操作wim文件

[复制链接]
发表于 2009-12-24 12:36:09 | 显示全部楼层 |阅读模式
最近写个小程序涉及到wim文件的操作,担折腾了很久都弄不出来!附件里是相关函数的声明,请各位大大给WIMMountImage,WIMGetImageInformation函数的例子!~~

[ 本帖最后由 冷风无泪 于 2009-12-25 15:29 编辑 ]

WIMGAPI.rar

2.77 KB, 下载次数: 134, 下载积分: 无忧币 -2

发表于 2009-12-24 19:10:27 | 显示全部楼层
楼主这个 WIMGAPI.PAS 是从哪 里弄来的?
回复

使用道具 举报

 楼主| 发表于 2009-12-24 20:00:31 | 显示全部楼层
百度搜出来的,在下面的网址!

http://www.delphipraxis.net/post1061317.html
回复

使用道具 举报

发表于 2009-12-24 21:34:48 | 显示全部楼层
试着翻译了一下MSDN,仅作抛砖引玉用。。。
本人技术很菜,仅供UP主参考。。。

[ 本帖最后由 f00l 于 2009-12-24 21:45 编辑 ]
无标题.png

Demo1.zip

954 Bytes, 下载次数: 70, 下载积分: 无忧币 -2

回复

使用道具 举报

 楼主| 发表于 2009-12-24 23:32:29 | 显示全部楼层
谢谢f00l了,明晚再折腾!~~
回复

使用道具 举报

发表于 2009-12-25 00:45:56 | 显示全部楼层
本人在2006年已将 C++ 格式的头文件 WIMGAPI.H 转换成了 Delphi 的单元文件 WIMGAPI.PAS。
http://bbs.wuyou.net/viewthread. ... p%3Bfilter%3Ddigest

WIMMountImage 的用法很简单,函数声明如下:
WIMMountImage: function(lpszMountPath{映像挂载目录},
    lpszWimFileName{映像文件名}: PWideChar;
    dwImageIndex: DWORD; //被挂载的卷ID
    lpszTempPath: PWideChar //WIM临时工作目录
    ): BOOL; stdcall; {返回值TRUE为成功,FALSE为失败}


WIMGetImageInformation 的用法也不难,真正难是自己去处理它的返回结果,
难就难在要自己解释 WIM 的 Info,WIM 的 Info 是 Unicode 格式编码的 XML 文档。
WIMGetImageInformation 函数声明如下:
WIMGetImageInformation: function(hWim: HWND; //由 WIMCreateFile 或 WIMLoadImage 返回的句柄
    pvImageInfo: Pointer; //缓冲区地址(指针,这个缓冲区要自己伸请内存,并保证足够大)
    pcbImageInfo: PDWORD //缓冲区大小的地址(指针)
   ): BOOL; stdcall; {返回值TRUE为成功,FALSE为失败}

[ 本帖最后由 lxl1638 于 2009-12-25 00:52 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2009-12-25 15:29:26 | 显示全部楼层
procedure TForm1.Button1Click(Sender: TObject);
const
created : DWORD =1;
var
FileHandle:THandle;
Size:   Integer;
Buffer:   PChar;
Pot:PDWORD;
begin
    InitWIMGAPI;
    FileHandle:=WIMCreateFile(PWideChar('E:\tempfiles\sources\install.wim'),WIM_GENERIC_READ,WIM_OPEN_EXISTING, WIM_FLAG_SHARE_WRITE, WIM_COMPRESS_XPRESS,@created);
    Size:=10000;
    GetMem(Buffer,Size);
    pot:=@Size;
    if WIMGetImageInformation(FileHandle,Buffer,pot) Then
    begin
    MessageBox(0, Buffer, '', MB_OK);
    end;
    FreeMem(Buffer);
end;

请教一下老九,怎么MessageBox后显示的是这样的?
1.jpg
应该怎样改,还请教一下我!~~
回复

使用道具 举报

发表于 2009-12-25 17:48:05 | 显示全部楼层
原帖由 冷风无泪 于 2009-12-25 15:29 发表

请教一下老九,怎么MessageBox后显示的是这样的?
78213
应该怎样改,还请教一下我!~~

procedure TForm1.Button1Click(Sender: TObject);
const
created : DWORD =1;
var
FileHandle:THandle;
Size:   Integer;
Buffer:   PChar;
Pot:PDWORD;
begin
    InitWIMGAPI;
    FileHandle:=WIMCreateFile(PWideChar('E:\tempfiles\sources\install.wim'),WIM_GENERIC_READ,WIM_OPEN_EXISTING, WIM_FLAG_SHARE_WRITE, WIM_COMPRESS_XPRESS,@created);
    Size:=10000;
    GetMem(Buffer,Size);
    pot:=@Size;
    if WIMGetImageInformation(FileHandle,Buffer,pot) Then
    begin
    MessageBox(0, Buffer, '', MB_OK);
    end;
    FreeMem(Buffer);
end;




WIMGetImageInformation填入Buffer的是Unicode编码的数据。

Delphi 中 MessageBox 的第二个参数是Ansi字符串。

[ 本帖最后由 lxl1638 于 2009-12-25 17:53 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2009-12-25 19:13:21 | 显示全部楼层
但是用
MessageBoxW(0, Buffer, '', MB_OK);

仍是乱码的?
回复

使用道具 举报

发表于 2009-12-25 19:55:19 | 显示全部楼层
如果你用是Delphi2009及2010,那么你定义的Buffer:   PChar;其实是Buffer:   PWideChar;
如果你用的Delphi2007级以下版本或者Lazarus,那么你定义的Buffer:   PChar;其实是Buffer:   PAnsiChar;


为了各版本通用,请定义成Buffer:   PWideChar;
回复

使用道具 举报

 楼主| 发表于 2009-12-25 21:13:40 | 显示全部楼层
我现在用的delphi版本是2010,定义成Buffer:PWideChar;同样也是乱码!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-9-14 23:08

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表