私は主に Delphi 開発者であり、Logitech の G15 などの API DLL とインターフェイスしてキーボードの LCD 画面と対話する DLL ラッパーを使用しています。
数年前、ある人がこのラッパーを 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>
Delphi コード:
DLLHandle := LoadLibrary('lgLcdWrapperX64.dll');
if DLLHandle = 0 then Exit(False);
@lgLcdInit := GetProcAddress(dllHandle, 'lgLcdInitWrap');
if (not Assigned(lgLcdInit)) then ShowMessage(SysErrorMessage(GetLastError));