我主要是 Delphi 开发人员,我一直在使用 DLL 包装器,它与 Logitech 的 G15 等 api DLL 接口以与键盘 LCD 屏幕进行交互。
几年前,有人制作了这个包装器以与 delphi 一起使用,基本上是一个与 Logitech lib 接口并将函数导出到 Delphi 的 DLL。它一直运行良好,但是,它只是 32 位的。
我得到了包装源并尝试将其编译为 64 位,但出了点问题。我将平台设置为 64 位,相应地更改了配置等(我认为),并将库路径指向 Logitech 64 位 .lib
导出似乎在那里,但是当我尝试使用 GetProcAddress 加载任何内容时,出现错误“找不到指定的模块”
怎么了?
// lgLCDWrapper.DLL
//
// A Wrapper-DLL for Delphi and other compilers who cannot include the original
// lcLcd.Lib provided by Logitech. These functions are needed to communicate with
// the graphical LCD of an Logitech G15-Keyboard.
//
// Code by Olaf Stieleke, May 1st, 2007
// Compiler Visual C++ 2005 Express Edition
// Hereby dedicated to Open Source under GPL-License.
//
//Make sure to set additional Include-Path to lglcd.h (found in Logitech-SDK-Folders)
//Make sure to set additional Library-Path to lglcd.lib (found in Logitech-SDK-Folders)
#include "stdafx.h"
#include <lglcd.h>
#include "lgLcdWrapper.h"
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call,LPVOID lpReserved)
{
return TRUE;
}
DWORD _cdecl lgLcdInitWrap(void)
{
return lgLcdInit();
}
DWORD _cdecl lgLcdDeInitWrap(void)
{
return lgLcdDeInit();
}
DWORD _cdecl lgLcdConnectAWrap(lgLcdConnectContextA *ctx)
{
return lgLcdConnectA(ctx);
}
DWORD _cdecl lgLcdDisconnectWrap(int connection)
{
return lgLcdDisconnect(connection);
}
DWORD _cdecl lgLcdEnumerateWrap(int connection, int index, lgLcdDeviceDesc *description)
{
return lgLcdEnumerate(connection,index,description);
}
DWORD _cdecl lgLcdOpenWrap(lgLcdOpenContext *ctx)
{
return lgLcdOpen(ctx);
}
DWORD _cdecl lgLcdCloseWrap(int device)
{
return lgLcdClose(device);
}
DWORD _cdecl lgLcdReadSoftButtonsWrap(int device, DWORD *buttons)
{
return lgLcdReadSoftButtons(device,buttons);
}
DWORD _cdecl lgLcdUpdateBitmapWrap(int device, lgLcdBitmapHeader *bitmap, DWORD priority)
{
return lgLcdUpdateBitmap(device,bitmap,priority);
}
DWORD _cdecl lgLcdSetAsLCDForegroundAppWrap(int device, int foregroundYesNoFlag)
{
return lgLcdSetAsLCDForegroundApp(device,foregroundYesNoFlag);
}
包含文件
extern "C" __declspec(dllexport) DWORD _cdecl lgLcdInitWrap(void);
extern "C" __declspec(dllexport) DWORD _cdecl lgLcdDeInitWrap(void);
extern "C" __declspec(dllexport) DWORD _cdecl lgLcdConnectAWrap(lgLcdConnectContextA *ctx);
extern "C" __declspec(dllexport) DWORD _cdecl lgLcdDisconnectWrap(int connection);
extern "C" __declspec(dllexport) DWORD _cdecl lgLcdEnumerateWrap(int connection, int index, lgLcdDeviceDesc *description);
extern "C" __declspec(dllexport) DWORD _cdecl lgLcdOpenWrap(lgLcdOpenContext *ctx);
extern "C" __declspec(dllexport) DWORD _cdecl lgLcdCloseWrap(int device);
extern "C" __declspec(dllexport) DWORD _cdecl lgLcdReadSoftButtonsWrap(int device, DWORD *buttons);
extern "C" __declspec(dllexport) DWORD _cdecl lgLcdUpdateBitmapWrap(int device, lgLcdBitmapHeader *bitmap, DWORD priority);
extern "C" __declspec(dllexport) DWORD _cdecl lgLcdSetAsLCDForegroundAppWrap(int device, int foregroundYesNoFlag);
stdafx.cpp
#include "stdafx.h"
// stdafx.h : Includedatei für Standardsystem-Includedateien
// oder häufig verwendete projektspezifische Includedateien,
// die nur in unregelmäßigen Abständen geändert werden.
//
#pragma once
// Ändern Sie folgende Definitionen für Plattformen, die älter als die unten angegebenen sind.
// In MSDN finden Sie die neuesten Informationen über die entsprechenden Werte für die unterschiedlichen Plattformen.
#ifndef WINVER // Lassen Sie die Verwendung spezifischer Features von Windows XP oder später zu.
#define WINVER 0x0501 // Ändern Sie dies in den geeigneten Wert für andere Versionen von Windows.
#endif
#ifndef _WIN32_WINNT // Lassen Sie die Verwendung spezifischer Features von Windows XP oder später zu.
#define _WIN32_WINNT 0x0501 // Ändern Sie dies in den geeigneten Wert für andere Versionen von Windows.
#endif
#ifndef _WIN32_WINDOWS // Lassen Sie die Verwendung spezifischer Features von Windows 98 oder später zu.
#define _WIN32_WINDOWS 0x0410 // Ändern Sie dies in den geeigneten Wert für Windows Me oder höher.
#endif
#ifndef _WIN32_IE // Lassen Sie die Verwendung spezifischer Features von IE 6.0 oder später zu.
#define _WIN32_IE 0x0600 // Ändern Sie dies in den geeigneten Wert für andere Versionen von IE.
#endif
#define WIN32_LEAN_AND_MEAN // Selten verwendete Teile der Windows-Header nicht einbinden.
// Windows-Headerdateien:
#include <windows.h>
德尔福代码:
DLLHandle := LoadLibrary('lgLcdWrapperX64.dll');
if DLLHandle = 0 then Exit(False);
@lgLcdInit := GetProcAddress(dllHandle, 'lgLcdInitWrap');
if (not Assigned(lgLcdInit)) then ShowMessage(SysErrorMessage(GetLastError));