2016年11月26日

WIN64ビルドでcabinet sdkを使う

C++BuilderXE7で問題があったのでメモ
それ以降はもしかしたら直ってるかもしれない(直ってないかもしれない)

cabinet sdkをWIN64でビルドするとリンクエラーになる
[ilink64 エラー] Error: Unresolved external 'FDICreate' referenced from xxxx\WIN64\DEBUG\CABINET.O
[ilink64 エラー] Error: Unresolved external 'FDIDestroy' referenced from xxxx\WIN64\DEBUG\CABINET.O
[ilink64 エラー] Error: Unresolved external 'FDIIsCabinet' referenced from xxxx\WIN64\DEBUG\CABINET.O
[ilink64 エラー] Error: Unresolved external 'FDICopy' referenced from xxxx\WIN64\DEBUG\CABINET.O
libファイルのリンク方法は以下の通り
#if _WIN64
#pragma link "Cabinet.a" // リンクエラー
#else
#pragma link "Cabinet.lib" // OK
#endif
WIN32でビルドすると問題なく通る

幸いなことに最近の?RadStudioはPlatformSDKが入っているので、
FDI.HやCabinet.lib等のファイルを別途持ってくる必要なくビルドできる

で、問題はWIN64ですが、
clangに追従していないのか、付属のCabinet.aではダメっぽい
ちなみに、libファイルは以下の場所にある。
C:\Program Files (x86)\Embarcadero\Studio\15.0\lib\win32\release\psdk\Cabinet.lib
C:\Program Files (x86)\Embarcadero\Studio\15.0\lib\win64\release\psdk\Cabinet.a
以下のようにしてdllからCabinet.aファイルを作り直してそれを使えばいけた
mkexp Cabinet.a C:\Windows\System32\cabinet.dll
ただしこの方法は、なるべく古いOSのcabinet.dll(x64)で作成しないと、
古いOSで使えない場合がある
手元のcaibnet.dll(x64)は。。。
cabinet.dll 121.562KB 2016/07/16 20:42
Win10なのでとても新しい。。。。
XP(もしくはVista)の64bitあたりのcabinet.dllがほしいな。。。
posted by sanahi at 20:45| 滋賀 ☁| Comment(0) | TrackBack(0) | C++Builder | このブログの読者になる | 更新情報をチェックする

2016年11月03日

WM_INPUTテスト

WM_INPUTを使うアレ
キーフックDLLを作らないで、グローバルフックみたいな どこでもキーを受けられるかテスト
XP以降
つかえるかなぁ〜

Unit1.h

//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
private:	// ユーザー宣言
	void __fastcall OnWmInput(TMessage &msg);
	BEGIN_MESSAGE_MAP
		VCL_MESSAGE_HANDLER(WM_INPUT, TMessage, OnWmInput)
	END_MESSAGE_MAP(TForm)
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Unit1.cpp

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	RAWINPUTDEVICE rid;
	::ZeroMemory( &rid, sizeof(rid) );
	rid.usUsagePage = 0x01; // <--このへんでキーボードかマウスか指定
	rid.usUsage = 0x06; // <--このへんでキーボードかマウスか指定
	//rid.dwFlags = RIDEV_NOLEGACY | RIDEV_EXINPUTSINK; // <-- RIDEV_NOLEGACYつけるかはお好みで
	rid.dwFlags = RIDEV_EXINPUTSINK;
	rid.hwndTarget = Handle;
	::RegisterRawInputDevices(&rid, 1, sizeof(rid));
}
//---------------------------------------------------------------------------
//! WM_INPUT イベントハンドラ
void __fastcall TForm1::OnWmInput(TMessage &msg)
{
	RAWINPUT raw;
	UINT sz = sizeof(raw);

	::GetRawInputData( (HRAWINPUT)msg.LParam, RID_INPUT, &raw, &sz, sizeof(raw.header) );
	// この辺の条件判定はお好みで...
	if( (raw.header.dwType == RIM_TYPEKEYBOARD) && (raw.data.keyboard.Flags & RI_KEY_BREAK) ) {
	  if( raw.data.keyboard.VKey == VK_SNAPSHOT ) { // PrintScreenキー
		::OutputDebugString(L"VK_SNAPSHOT\n");  // <-- ここ
	  }
	}
}
//---------------------------------------------------------------------------

posted by sanahi at 11:34| 滋賀 ☁| Comment(0) | TrackBack(0) | C++Builder | このブログの読者になる | 更新情報をチェックする

Remarks
記事中にソースコードが含まれる場合、ソースコードの再利用、改変、「オレのものにする」等は自由ですが、
ソースコードを利用して起こった問題は一切責任を負いません。(自己責任での利用となります。)
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。