鋼鉄の咆哮 早く新作だして。・゚・(ノД`)・゚・。
×
[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 はこれだけです。
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触ってなかったり)の間にちょっとだけ成長してる?
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
この記事にコメントする