我可以在x86应用程序中加载x64内部的资源库(DLL)吗?

时间:2012-09-18 08:29:54

标签: x86 64-bit loadlibrary

我想加载在默认Windows打印机驱动程序资源文件中使用的unired.dll。 我可以为Windows Vista x86加载unires.dll。

它位于C:\ Windows \ System32 \ spool \ drivers \ w32x86 \ 3

但现在我使用的是Windows 7 Pro x64。

所以同名unires.dll位于 无法加载C:\ Windows \ System32 \ spool \ drivers \ x64 \ 3。

通过以下代码,GetLastError()返回193

有可能吗?还是不可能? 我使用Visual Studio 2005 Pro。尝试构建x64和x86,但每个都失败了。

TCHAR libName[MAX_PATH];
wsprintf(libName , _T("unires.dll"));

HINSTANCE hLibraryInstance = ::LoadLibrary(libName);
DWORD ErrorId=::GetLastError();

std::wofstream out;
out.open(_T("unires.txt"));

for(UINT resKey=0;resKey<100000;resKey++)
{

    TCHAR * resBuf=new TCHAR[CHAR_MAX]; 
    int BufferMaxSize=CHAR_MAX;
    int Result=::LoadString(hLibraryInstance, resKey, resBuf, BufferMaxSize);

    wstring resStr=resBuf;

    if(!resStr.empty())
    {
        out<<resKey;
        out<<" ";
        out<<resStr.c_str();
        out<<endl;
    }

    if(resBuf!=NULL)
    {
        delete [] resBuf;
    }
}

out.close();

请帮帮我。 最好的问候!!

2 个答案:

答案 0 :(得分:2)

如评论链接中所述,您无法在x86进程中加载​​x64库。

解决方案可能是将程序移植到64位。

答案 1 :(得分:0)

根据有关LoadResource的MSDN文章,第一个参数应该是可选的。

对我来说,当我尝试访问位于另一个exe文件中的资源时,LoadResource会生成错误代码193,而不传递hModule参数。

不起作用:

HRSRC hResource = FindResource(LoadLibrary(strFileName.c_str()), MAKEINTRESOURCE(1), RT_STRING);
HGLOBAL hResHandle = LoadResource(NULL, hResource);

像魅力一样:

HMODULE hExe = LoadLibrary(strFileName.c_str());
HRSRC hResource = FindResource(hExe, MAKEINTRESOURCE(1), RT_STRING);
HGLOBAL hResHandle = LoadResource(hExe, hResource);