【发布时间】:2017-07-10 15:58:00
【问题描述】:
我在 64 位 Windows 中安装了 Mozilla FireFox x64,现在我想安装 LoadLibrary(mozglue.dll),但我收到错误号 193
LoadLibrary(mozglue.dll) 在带有Mozilla FireFox 86 的 32 位窗口中运行良好
我使用这个代码:
#include <Windows.h>
#include <strsafe.h>
int main()
{
HMODULE hndl;
DWORD dwError = 0;
WCHAR errorBuff[MAX_PATH] = {};
hndl = LoadLibraryW(L"C:\\Program Files\\Mozilla Firefox\\mozglue.dll");
dwError = GetLastError();
StringCbPrintfW(errorBuff, MAX_PATH, L"%d", dwError);
MessageBoxW(NULL, errorBuff, L"GetLastError", MB_OK);
FreeLibrary(hndl);
return 0;
}
这段代码有什么问题?
编辑:
我用:
LoadLibraryExW(L"C:\\Program Files\\Mozilla Firefox\\mozglue.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
代替:
LoadLibraryW(L"C:\\Program Files\\Mozilla Firefox\\mozglue.dll");
现在 GetLastError 返回 0 但 GetProcAddress 失败...
#include <Windows.h>
#include <strsafe.h>
typedef enum SECItemType {
siBuffer = 0,
siClearDataBuffer = 1,
siCipherDataBuffer,
siDERCertBuffer,
siEncodedCertBuffer,
siDERNameBuffer,
siEncodedNameBuffer,
siAsciiNameString,
siAsciiString,
siDEROID,
siUnsignedInteger,
siUTCTime,
siGeneralizedTime
};
struct SECItem {
SECItemType type;
unsigned char *data;
size_t len;
};
typedef enum SECStatus {
SECWouldBlock = -2,
SECFailure = -1,
SECSuccess = 0
};
typedef struct PK11SlotInfoStr PK11SlotInfo;
typedef SECStatus(*NSS_Init) (const char *);
typedef SECStatus(*NSS_Shutdown) (void);
typedef PK11SlotInfo * (*PK11_GetInternalKeySlot) (void);
typedef void(*PK11_FreeSlot) (PK11SlotInfo *);
typedef SECStatus(*PK11_Authenticate) (PK11SlotInfo *, int, void *);
typedef SECStatus(*PK11SDR_Decrypt) (SECItem *, SECItem *, void *);
PK11_GetInternalKeySlot PK11GetInternalKeySlot;
PK11_FreeSlot PK11FreeSlot;
PK11_Authenticate PK11Authenticate;
PK11SDR_Decrypt PK11SDRDecrypt;
NSS_Init fpNSS_INIT;
NSS_Shutdown fpNSS_Shutdown;
BOOL loadFunc()
{
HMODULE hndl;
DWORD dwError = 0;
WCHAR errorBuff[MAX_PATH] = {};
BOOL retVal = FALSE;
hndl = LoadLibraryExW(L"C:\\Program Files\\Mozilla Firefox\\mozglue.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
dwError = GetLastError();
StringCbPrintfW(errorBuff, MAX_PATH, L"%d", dwError);
MessageBoxW(NULL, errorBuff, L"GetLastError", MB_OK);
hndl = LoadLibraryExW(L"C:\\Program Files\\Mozilla Firefox\\nss3.dll", NULL, LOAD_LIBRARY_AS_DATAFILE);
dwError = GetLastError();
StringCbPrintfW(errorBuff, MAX_PATH, L"%d", dwError);
MessageBoxW(NULL, errorBuff, L"GetLastError", MB_OK);
if (hndl)
{
fpNSS_INIT = (NSS_Init)GetProcAddress(hndl, "NSS_Init");
fpNSS_Shutdown = (NSS_Shutdown)GetProcAddress(hndl, "NSS_Shutdown");
PK11GetInternalKeySlot = (PK11_GetInternalKeySlot)GetProcAddress(hndl, "PK11_GetInternalKeySlot");
PK11FreeSlot = (PK11_FreeSlot)GetProcAddress(hndl, "PK11_FreeSlot");
PK11Authenticate = (PK11_Authenticate)GetProcAddress(hndl, "PK11_Authenticate");
PK11SDRDecrypt = (PK11SDR_Decrypt)GetProcAddress(hndl, "PK11SDR_Decrypt");
}
return !(!fpNSS_INIT || !fpNSS_Shutdown || !PK11GetInternalKeySlot || !PK11Authenticate || !PK11SDRDecrypt || !PK11FreeSlot);
}
int main()
{
if (loadFunc())
{
MessageBoxW(NULL, L"OK", L"", MB_OK);
}
else
{
MessageBoxW(NULL, L"NO", L"", MB_OK);
}
return 0;
}
【问题讨论】:
-
你是如何编译你的代码的?你是编译成64位的吗?您在此处安装的 mozglue 很可能是 64 位,与 Firefox 的其余部分一样,如果您的可执行文件是 32 位,则无法加载它。
-
您可以在 64 位 Windows 上将 32 位 DLL 加载到 32 位 进程 中,但不能将其加载到 64位过程。所以你必须安装 32 位 Firefox。
-
我为 32 位编译一次,为 64 位编译一次,但都得到错误 193
-
安装 64 位 Firefox 时需要这样做
-
如果您完成了错误 193 并遇到了另一个问题,请接受最有帮助的答案并提出另一个问题。