Function Reference

DllStructCreate

DllCallで使用するためのC/C++スタイルの構造体を作成します。

DllStructCreate ( "Struct" [,Pointer] )

 

パラメータ

"Struct" 作成する構造体を表す文字列(注意を参照)。
Pointer [オプション]使用した場合、構造体にメモリが割り当てられるかわりにポインタが使用されます。

 

返し値

成功 DllStruct系の関数で使用できる変数。
失敗 0
@Error: 0 = エラーなし。
1 = DllStructCreateに渡された変数が文字列でない。
2 = 渡された文字列が表すデータ型が不正。
3 = 構造体へのメモリ割り当てに失敗、もしくはPointer = 0。
4 = 渡された文字列へのメモリ割り当てエラー。


詳細
BYTE 8ビット(1バイト)符号なし文字
BOOLEAN 8ビット(1バイト)符号なし文字
CHAR 8ビット(1バイト)ASCII文字
WCHAR 16ビット(2バイト)UNICODEワイド文字
short 16ビット(2バイト)符号付き整数
USHORT 16ビット(2バイト)符号なし整数
WORD 16ビット(2バイト)符号なし整数
int 32ビット(4バイト)符号付き整数
long 32ビット(4バイト)符号付き整数
BOOL 32ビット(4バイト)符号付き整数
UINT 32ビット(4バイト)符号なし整数
ULONG 32ビット(4バイト)符号なし整数
DWORD 32ビット(4バイト)符号なし整数
INT64 64ビット(8バイト)符号付き整数
UINT64 64ビット(8バイト)符号なし整数
ptr 32ビットまたは64ビット符号なし整数 (x86版、x64版どちらのAutoItが使われているかに依存します) 32ビット(4バイト) 整数
HWND 32ビット(4バイト) 整数
HANDLE 32ビット(4バイト) 整数
float 32ビット(4バイト)浮動小数点
double 64ビット(8バイト)浮動小数点
INT_PTR, LONG_PTR, LRESULT, LPARAM 32ビットまたは64ビット符号付き整数 (x86版、x64版どちらのAutoItが使われているかに依存します)
UINT_PTR, ULONG_PTR, DWORD_PTR, WPARAM 32ビットまたは64ビット符号なし整数 (x86版、x64版どちらのAutoItが使われているかに依存します)

注意

各データ型はセミコロン ';' で区切られていなければなりません。

配列を作成する場合はデータ型の後ろに'[サイズ]'をつけます。例:DllStructCreate("int;char[128]")

C-スタイルの宣言と同じように要素名を追加することができます。例:DllStructCreate("int n;char buffer[128]")
このデータ名は他のDllStruct...関数の要素名として使用できます。データ名にはアルファベットと下線が使用できます。

構造体で異なるアライメントの接頭辞を使用するにはalignキーワードを使用します。 nのデフォルト値は8です。有効な値は1、2、4、8、16です。 メンバーのアライメントは境界上になり、これはnの倍数またはメンバーのサイズの倍数の小さい方になります。 これはMicrosoft Visual C++ コンパイラの#pragma pack オプションと同じです。

DllStructCreate("short;int") ; 構造体は8バイト。"int"は4バイトオフセットされる。
DllStructCreate("align 2;short;int") ; 構造体は6バイト。"int"は2バイトオフセットされる。

DllStructCreate("byte;double") ; 構造体は16バイト。"double"は8バイトオフセットされる。
DllStructCreate("align 4;byte;double") ; 構造体は12バイト。"double"は4バイトオフセットされる。

アライメントの変更が必要な場合には変更が必要な最初の要素の前で"align"を使用します。
"align"または"align 8"とするとデフォルトのアライメントになります。

割り当てられたメモリを解放するには返された変数に0を代入してください。

 

関連

DllCall, DllStructGetData, DllStructSetData, DllStructGetPtr, DllStructGetSize, IsDllStruct

 


;=========================================================
;   構造体作成
;   struct {
;       int             var1;
;       unsigned char   var2;
;       unsigned int    var3;
;       char            var4[128];
;   }
;=========================================================
$str        = "int var1;ubyte var2;uint var3;char var4[128]"
$a          = DllStructCreate($str)
if @error Then
    MsgBox(0,"","Error in DllStructCreate " & @error);
    exit
endif

;=========================================================
;   構造体にデータを設定
;   struct.var1 = -1;
;   struct.var2 = 255;
;   struct.var3 = INT_MAX; -1 は(unsigned int に)型キャストされる
;   strcpy(struct.var4,"Hello");
;   struct.var4[0]  = 'h';
;=========================================================
DllStructSetData($a,"var1",-1)
DllStructSetData($a,"var2",255)
DllStructSetData($a,"var3",-1)
DllStructSetData($a,"var4","Hello")
DllStructSetData($a,"var4",Asc("h"),1)

;=========================================================
;   構造体の情報を表示
;=========================================================
MsgBox(0,"DllStruct","Struct Size: " & DllStructGetSize($a) & @CRLF & _
        "Struct pointer: " & DllStructGetPtr($a) & @CRLF & _
        "Data:" & @CRLF & _
        DllStructGetData($a,1) & @CRLF & _
        DllStructGetData($a,2) & @CRLF & _
        DllStructGetData($a,3) & @CRLF & _
        DllStructGetData($a,4))

;=========================================================
;    必要な場合、構造体に割り当てられたメモリを解放
;=========================================================
$a=0