忍者ブログ
鋼鉄の咆哮 早く新作だして。・゚・(ノД`)・゚・。
[530]  [529]  [528]  [527]  [526]  [525]  [524]  [523]  [522]  [521]  [520
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

見事に3年ぶり 2回目のAutoItネタw
AutoIt で DLL を動的にコールする方法と呼ばれる側の DLL 作り方メモ。

AutoIt で動的に DLL をコールするなら DllCall 関数を利用する。

$result = DllCall("dll", "return type", "function", type1, param1, [type2, param2])

AutoItで取得したスナップショットのパスをDLLに渡して形状比較の結果を戻り値を Double型 で受け取る例
-----
main()

func main()
local $result, $dll ="matching.dll",$matchtype = "ContoursMatching"
local $srcPath = "比較元のスナップショットのパス"、$cmpPath = "比較対象のスナップショットのぱす"

$result = DllCall($dll, "double", $matchtype, "str", $srcPath, "str", $cmpPath)

MsgBox(0, "Match score", $result)
endFunc
-----
説明
"return type" で、戻り値の型(double) を記述
type1、type2 は DLL に渡す型として ”str" を記述
param1、param2 は DLL に渡す値(パス)を記述


AutoIt はこれだけです。

で、DLL の方。

matching.cpp
-----
#include
#include "./matching.h"
#include
#include
#include

// DLL インスタンス ハンドル
static HINSTANCE g_dllInstanceHandle = NULL;
//------------------------------------------------------------------------------
// DLL メイン
//------------------------------------------------------------------------------
BOOL WINAPI DllMain( HINSTANCE dllInstanceHandle, DWORD reeason, LPVOID pReserved )
{
switch ( reeason )
{
case DLL_PROCESS_ATTACH :
g_dllInstanceHandle = dllInstanceHandle;
break;

case DLL_PROCESS_DETACH :
g_dllInstanceHandle = NULL;
break;

case DLL_THREAD_ATTACH :
break;

case DLL_THREAD_DETACH :
break;
}

return TRUE;
}
//------------------------------------------------------------------------------
//形状比較関数
//------------------------------------------------------------------------------
DLLPORT void __stdcall TemplateMatching( LPSTR a, LPSTR b, LPSTR c)
{
中身は省略
}

DLLPORT double __stdcall ContoursMatching( LPSTR a, LPSTR b)
{
中身は省略
}

DLLPORT double __stdcall ObjectMatching( LPSTR a, LPSTR b)
{
中身は省略
}
-----

matching.h
-----
#pragma once


#define EXPORT_MATCHING

#ifdef EXPORT_MATCHING
#define DLLPORT __declspec( dllexport )
#else
#define DLLPORT __declspec( dllimport )
#endif


#ifdef __cplusplus
extern "C"{
#endif

DLLPORT double __stdcall ContoursMatching( LPSTR a, LPSTR b );
DLLPORT double __stdcall ObjectMatching( LPSTR a, LPSTR b );
DLLPORT double __stdcall TemplateMatching( LPSTR a, LPSTR b, LPSTR c);

#ifdef __cplusplus
}
#endif
-----

matching.def
-----
LIBRARY Matching

EXPORTS
ContoursMatching @1
ObjectMatching @2
TemplateMatching @3
-----

作成時の失敗
関数のみを記述してビルドしていたので、AutoIt からコールできなかった。
AutoIt のヘルプファイルに書いてあるのですが、Windows API として DLL を コールするので、DLLメインのほかにヘッダとdef ファイルを適切に記述する必要がある。
つか、C++ で DLL を作るのが初めてだったので作法を知らなかった。
C++ で何かをすること自体2年ぶり(2年前はC++の独習にWin32アプリとして倉庫番クローンを作った位)だったので、そんなの( ´ー`)シラネーヨ とw。

3年(といっても○っと1年くらいAutoIt触ってなかったり)の間にちょっとだけ成長してる?
PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
最新CM
[05/08 NONAME]
[05/05 wakaiy]
[08/02 毒さん]
[08/02 serani]
[02/26 毒さん]
最新TB
プロフィール
HN:
毒さん
性別:
非公開
バーコード
ブログ内検索
忍者ブログ [PR]