Не работает на Windows 7, но работает на Windows 8 DLL

У меня есть два DLL-файла, A и B.

A нужен B для setWindowsHookEx ().

Я использую:

LoadLibrary(L"C:\\Sources\\TestDLL.dll") and GetProcAddress(hDll, "GetMsgProc")

Когда я пытаюсь запустить свою программу в Windows 7, GetProcAddress(hDll, "GetMsgProc") возвращает ошибку.

GetLastError() возвращает 122, но я думаю, что это не хороший код ошибки.

Когда я запускаю свою программу на Windows 8, все работает.

Когда я меняю вызов функции в GetProcAddress(hDll, "foo")

typedef void(*foo)(); просто создает окно сообщения

Все работает на Windows 7 и Windows 8.

Я думаю, что моя проблема __stdcalЯ не могу найти решение.

DLL-файл A

typedef void(*foo)();

typedef LRESULT(_stdcall *LPGetMsgProc)(int nCode, WPARAM wParam, LPARAM lParam);#define NOM_CLASSE_JAVA_TEST "Lcom/XXX/controller/fonctions/Fonctions;"
JNIEXPORT jboolean JNICALL Java_com_XXX_system_Jni_getVeille
(JNIEnv *env, jclass)
{
{
HINSTANCE hDll = (HINSTANCE)LoadLibrary(L"C:\\Sources\\TestDLL.dll");
CString str1("it ok");

if (!hDll)
{
CString str5("error1");
CString str4(GetLastError().ToString());
MessageBox(NULL, str4, str5, MB_ICONERROR);
return -1;
}

LPGetMsgProc pfnProc = (LPGetMsgProc)GetProcAddress(hDll, "GetMsgProc");

if (!pfnProc)
{
CString str5("error2");
CString str4(GetLastError().ToString());
MessageBox(NULL, str4, str5, MB_ICONERROR);
FreeLibrary(hDll);
return -1;
}

// Setup global hook
HHOOK hHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)pfnProc, hDll, 0);
if (!hHook)
{
CString str5("hookeroor");
CString str4(GetLastError().ToString());
MessageBox(NULL, str4, str5, MB_ICONERROR);
FreeLibrary(hDll);
return -1;
}

while (TRUE)
{
// Check to see if any messages are waiting in the queue
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
// Translate the message and dispatch it to WindowProc()
TranslateMessage(&msg);
DispatchMessage(&msg);
}

// If the message is WM_QUIT, exit the while loop
if (msg.message == WM_QUIT)
break;
}
return true;
}
}

DLL-файл B

#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <stdio.h>
#include <string>
#include <conio.h>
#include <tchar.h>
#include <boost/interprocess/file_mapping.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <iostream>
#include <fstream>
#include <cstddef>
#include <cstdio>    //std::remove
#include <vector>
#pragma comment(lib, "user32.lib")extern "C" _declspec(dllexport) void foo(void)
{
MessageBox(NULL, (LPCTSTR)"ok", (LPCTSTR)"ok", MB_ICONERROR);
}

//============================================================================
extern "C"{
_declspec(dllexport) LRESULT _stdcall GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
{
MessageBox(NULL, (LPCTSTR)"ok", (LPCTSTR)"ok", MB_ICONERROR);
nCode = 0;
wParam = NULL;
lParam = NULL;
}
}
//============================================================================

Я запускаю свою программу на Windows 8 64-битной и Windows 7 32-битной.

я бегу Зависимость Уокер и я нашел имя GetProcAddress(hDll, "_GetMsgProc@12");, но моя программа не будет работать.

0

Решение

В этом случае код или компилятор должен иметь Windows 8 и более новый код, который не совместим с Windows 7 или более ранней версией.

-2

Другие решения


По вопросам рекламы [email protected]