从Windows RT中的桌面应用程序加载“comctl32.dll”失败

时间:2013-01-06 09:24:09

标签: winapi windows-8 loadlibrary comctl32

使用http://forum.xda-developers.com/showthread.php?t=1944675中描述的方法,我使用Windows RT在我的表面执行了win32桌面应用程序。

可以使用 LoadLibrary 加载 user32.dll,kernel32.dll,gdi32.dll 等Windows窗口。 但是当我尝试使用 LoadLibrary 加载“comctl32.dll”“comdlg32.dll”时,它会返回NULL。

GetLastError()返回的错误代码为 1114 。这意味着“动态链接库(DLL)初始化例程失败。”

编辑: 当我测试为x86编译的应用程序时,它没有任何问题。当我为ARM构建它并在Windows RT下运行时,发生了这个错误。

示例代码:

HMODULE hModule;
hModule = LoadLibraryA("user32.dll");
printf("Load Library user32.dll : %x with Err: %x\n", hModule, GetLastError());
hModule = LoadLibraryA("kernel32.dll");
printf("Load Library kernel32.dll : %x with Err: %x\n", hModule, GetLastError());
hModule = LoadLibraryA("comctl32.dll");
printf("Load Library comctl32.dll : %x with Err: %x\n", hModule, GetLastError());

2 个答案:

答案 0 :(得分:1)

  

但是加载Microsoft批准的dll,如user32.dll和comctl32.dll是可能的

您认为comctl32.dll被“批准”是错误的。它的所有导出函数都不在可以在Store应用程序中使用的winapi函数列表中。它唯一的用途是为常用控件提供一个实现,它们都不能在Store应用程序中使用。它只能用于桌面应用程序,您无法在Windows RT上自行编写。

Microsoft没有理由让comctl32.dll在商店应用的沙箱中运行。因此预计不会起作用。

可以加载kernel32和user32,那些的DLL包含已批准的winapi函数。但是,使用未在批准列表中的任何功能将使您在验证测试中失败。你无法发布这样的应用程序。

答案 1 :(得分:0)

通常,当我使用ComCtl32.dll时,我还会添加清单依赖项,如this MSDN article(特别是this section)中所述。不确定这是否是您无法加载它的原因,但如果您想以任何方式使用它,您可能需要添加清单信息。

不了解ComDlg32.dll。