4.6. Dll 加载

编写:Ove K鍁en

(提取自 wine/documentation/dll-overrides)

wine.conf 指令(directive) [DllDefaults] 和 [DllOverrides] 是有些混乱的主题。这些指令的最终目的是足够清楚的,通过 - 给出一个选择,Wine 应该使用自己的内置 DLL,或者应该使用在现存的 Windows 安装中找到的 .DLL 文件? 本文档将解释这些特征是如何工作的。

4.6.1. DLL 类型

 

native

一个“固有的”DLL 是为真实的 Microsoft Windows 写的一个 .DLL 文件。

builtin

一个“内置的”DLL 是一个 Wine DLL。它们可以要么是 libwine.so 的一部分, 要么是在新近的版本中,在 Wine 在需要的时候可以装载的一个特殊的 .so 文件。

elfdll

一个“elfdll”是有着一个特殊的 Windows 式样的文件结构的一个 Wine .so 文件,它尽可能的与 Windows 相接近,并且通过使用特殊的 ELF 装载器和连接器技巧,可以无缝的与“固有的” DLL 进行动态连接。Bertho Stultiens 正在做这项工作,但这个特征还没有合并到 Wine 中(因为政治上的原因和缺乏时间),所以这个 DLL 类型此时在官方的 Wine 中不存在,“内置的” DLL 类型获取了 elfdll 的一些特征(比如动态装载),所以“elfdll”的功能可能即将融入“内置”类型中。

so

一个固有的 Unix .so 文件,加上在装载库时生成的(? on the fly )调用惯例转换 thunk。(with calling convention conversion thunks generated on the fly as the library is loaded) 对于“glide”这样的在 Windows 和 Unix 二者上使用相同的 API 的库,这是非常有用的。

译注:历史上,在实现 Algol 60 传名调用(call by name)的时候,把实际参数做为一个无参数的子程序来对待,传统上把这个无参数的子程序叫做 thunk。

4.6.2. [DllDefaults] 段

 

DefaultLoadOrder

如果正在处理的 DLL 未在 [DllOverrides] 段中找到,这个选项指定 Wine 应当以什么次序查找可获得的 DLL 类型。

4.6.3. [DllPairs] 段

有的时候,在缺省的配置文件中有一个叫 [DllPairs] 的段,它已经被废弃了,因为组对信息已经被嵌入到 Wine 自身中了。(本段的目的只不过是如果用户尝试组对(pair codependent)不同类型的16-bit/32-bit DLL 则发起警告。) 如果你的 wine.conf 或 ~/.wine/config 中仍然有它,你删除它是安全的。

4.6.4. [DllOverrides] 段

本段指定如何处理特定的 DLL,特别是,如果你从一个真实的 Windows 配置中得到一些“固有的”DLL,那么就要在这里指定是否使用它们。因为内置的 DLL 仍不能与固有的 DLL 无缝的混合,特定的 DLL 依赖可能有问题,但在 Wine中对许多流行的 DLL 配置存在着工作项目(workaround)。参见 WWN 的 [16] 状态页来找出你要用的 DLL 是否在 Wine 中被实现了。

当然也可以通过显式的使用 Wine 的 --dll 命令行选项来屏弃这些设置(详情参见手册页)。下面是对选择你的最优的配置的提示(列出 16/32-bit DLL 对):

 

krnl386, kernel32

它们的固有版本永远不能工作,所以不用尝试了。保持为 builtin

gdi, gdi32

图形设备接口。尝试运行固有的 GDI 没什么作用。保持为 builtin

user, user32

窗口管理和标准控件。有时可能要使用 Win95 的 native 版本(如果依赖于它的所有其他 DLL,比如 comctl32 和 comdlg32,也运行 native 版本的话)。但是,在地址空间独立(Address Space Separation)之后就不可能了,所以保持为 builtin

ntdll

NT 内核 API。尽管没有很好的编制文档,它的 native 版本是永远不能工作的。保留为 builtin

w32skrnl

Win32s (在 Win3.x 中)。它的 native 版本可能是永远不能工作的。保留为 builtin

wow32

NT 的 Win16 支持库。它的 native 版本可能是永远不能工作的。保留为 builtin

system

Win16 内核材料。它的 native 版本是永远不能工作的。保留为 builtin

display

显示器驱动程序。明确的保留为 builtin

toolhelp

工具帮助器例程。这很少出问题。保留为 builtin

ver, version

版本。很少有用和处理它(mess with)。

advapi32

注册表和安全特征。它的 native 版本是否工作是两可的。

commdlg, comdlg32

通用对话框,比如颜色选择器、字体对话框、打印对话框、打开/保存对话框,等等。尝试 native 版本是安全的。

commctrl, comctl32

通用控件。它们是工具条、状态条、列表控件、等。尝试 native 版本是安全的。

shell, shell32

Shell 接口(桌面、文件系统、等)。它是 Windows 中未编制文档最严重的部分之一,你可能走运的能使用它的 native 版本,如果你需要的话。

winsock, wsock32

Windows 套接口。它的 native 版本不能在 Wine 下工作,所以保留为 builtin

icmp

给 wsock32 的 ICMP 例程。如同 wsock32,保留为 builtin

mpr

由于 thunking 要点,它的 native 版本可能不工作。保留为 builtin

lzexpand, lz32

Lempel-Ziv 压缩。 Wine 的 builtin 版本应当工作的很好。

winaspi, wnaspi32

高级 SCSI 外设接口。它的 native 版本可能不工作。保留为 builtin

crtdll

C 运行时库。它的 native 版本很容易的比 Wine 的版本工作的好。

winspool.drv

打印机缓冲池。 你好象没有那么走运使用它的 native 版本。

ddraw

DirectDraw/Direct3D(直接绘制/直接三维)。因为 Wine 没有实现 DirectX HAL,现在它的 native 版本不能工作。

dinput

DirectInput(直接输入)。它的 native 版本是否工作是两可的。

dsound

DirectSound(直接声音)。可能运行它的 native 版本,但不要依仗它。

dplay/dplayx

DirectPlay(直接播放)。它的 native 版本应该工作的非常好,如果是完全的话。

mmsystem, winmm

多媒体系统。它的 native 版本好象不能工作。保留为 builtin

msacm, msacm32

音频压缩管理器。如果你把 msacm.drv 设置为相同的,它的 builtin 版本工作的非常好。

msvideo, msvfw32

Windows 视频。 可以安全的(和推荐)尝试 native 版本。

mcicda.drv

CD 音频 MCI 驱动程序。

mciseq.drv

MIDI Sequencer MCI 驱动程序(.MID 回放)。

mciwave.drv

Wave 音频 MCI 驱动程序(.WAV 回放)。

mciavi.drv

AVI MCI 驱动程序(.AVI 视频回放)。最好使用 native 版本。

mcianim.drv

Animation MCI 驱动程序。

msacm.drv

音频压缩管理器。设置为与 msacm32 相同。

midimap.drv

MIDI Mapper。

wprocs

这是 Wine 用于 thunking 目的的一个伪装 DLL。它的 native 版本不存在。