「■関数ポインタ改」の編集履歴(バックアップ)一覧はこちら
■関数ポインタ改 - (2012/08/21 (火) 18:14:48) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
*情報
作者名:YouTubeダウンロードし放題
引用元:なし
*概要
関数ポインタが最新のなでしこで使えない..って人が多かったので不具合を直しました。
これを使えばなでしこで
-マルチスレッド
-フォームをWinAPIレベルから作成してメッセージループを回す
-非同期な通信
-重い処理の非同期実行
などの高度な処理を実現できます
*[[ダウンロード>http://www26.atwiki.jp/isoroku_be?cmd=upload&act=open&pageid=189&file=%E9%96%A2%E6%95%B0%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E6%94%B9+1.01.nako]]
*変更点
+グローバルからアクセスできるように
+引数の型を指定できるように
*例1: マルチスレッド
終了判定とは整数
テストとは関数ポインタ
これについて
引数型=「」
イベントは~
スレッド2処理
ExitThread(1)
テストで解放
スレッドIDとは整数
CreateThread(0,0,テストのポインタ,0,0,POINTER(スレッドID))
「このようにユーザーを待機する処理の最中に..,」と言う
終了判定=1
●スレッド2処理
500回
もし、終了判定ならば抜ける
母艦=「...ほかの処理をすることもできます 」&今
0.5秒待つ
●CreateThread(lpThreadAttributes,dwStackSize,lpStartAddress,lpParameter,dwCreationFlags,lpThreadId) =DLL("kernel32.dll",
"HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // セキュリティ記述子
DWORD dwStackSize, // 初期のスタックサイズ
LPTHREAD_START_ROUTINE lpStartAddress, // スレッドの機能
LPVOID lpParameter, // スレッドの引数
DWORD dwCreationFlags, // 作成オプション
LPDWORD lpThreadId // スレッド識別子
)")
●ExitThread(dwExitCode) =DLL("kernel32.dll",
"VOID ExitThread(
DWORD dwExitCode // このスレッドの終了コード
)")
*例2: 窓列挙
ログとはメモ
そのレイアウトは「全体」
テストとは関数ポインタ
これについて
引数型=「HWND,LPARAM」
イベントは~
EnumWindowsProc(引数[0],引数[1])で戻る
EnumWindows(テストのポインタ,0)
テストで解放
●EnumWindowsProc(hwnd,lParam)
バッファとは文字列
バッファに128を確保
GetWindowText(hwnd,POINTER(バッファ),127)
タイトルとは文字列=バッファの(それ)バイト左部分
ログのテキスト=ログのテキスト&
「{hwnd},{タイトル}{~}」
1で戻る
●EnumWindows(lpEnumFunc,lParam) =DLL("user32.dll",
"BOOL EnumWindows(
WNDENUMPROC *lpEnumFunc, // コールバック関数
LPARAM lParam // アプリケーション定義の値
)")
●GetWindowText(hWnd,lpString,nMaxCount) =DLL("user32.dll",
"int GetWindowTextA(
HWND hWnd, // ウィンドウまたはコントロールのハンドル
LPTSTR lpString, // テキストバッファ
int nMaxCount // コピーする最大文字数
)")
*本体
!NAKO_GROUP_EXEC=GetProcAddress(GetModuleHandle("dnako.dll"),"nako_group_exec")
!MEM_COMMIT = $1000;
!MEM_RELEASE = $8000;
!PAGE_EXECUTE_READWRITE = $40;
!関数ポインタ名前とは配列
■関数ポインタ
・{イベント}イベント
・{整数}ポインタ
・{配列}引数
・{配列}引数型 ←型設定 →型取得
・{整数}返り値
・ポケット
・{整数}参照
・{整数}スタック
・解放~
関数ポインタ名前で名前を配列検索
関数ポインタ名前のそれを配列削除
VirtualFree(ポインタ,0,MEM_RELEASE)
・{非公開}前処理~
ストック_とは整数
ストック_=スタック+4
(引数型の配列要素数)回
引数[回数-1]=0
ストック_=ストック_+型サイズ[回数-1]
MoveMemory(POINTER(引数[回数-1]),
ストック_,型サイズ[回数-1])
返り値=イベント
・{配列}型サイズ
・{配列}F型
・{非公開}型取得~それはF型
・{非公開}型設定(V)~
退避用変数とは変数=それ
F型=Vを「,」で区切る
関数ポインタ名前で名前を配列検索
もし、それ!=-1ならば
「{名前}は関数ポインタとして既に宣言されています」とエラー発生
関数ポインタ名前に名前を配列追加
参照=ADDR("グローバル:{名前}"をナデシコする)
型サイズ=空
引数型で反復
対象の型サイズ取得
それを型サイズに配列追加
もし、ポインタ=0ならば
ポインタ=VirtualAlloc(0,64,
MEM_COMMIT,PAGE_EXECUTE_READWRITE)
PCとは整数=ポインタ
PCに$55を1でバイナリ追加
PCに$EC8Bを2でバイナリ追加
PCに$BAを1でバイナリ追加
PCにPOINTER(スタック)を4でバイナリ追加
PCに$2A89を2でバイナリ追加
PCに$68を1でバイナリ追加
PCにPOINTER("前処理")を4でバイナリ追加
PCに$68を1でバイナリ追加
PCに参照を4でバイナリ追加
PCに$B8を1でバイナリ追加
PCにNAKO_GROUP_EXECを4でバイナリ追加
PCに$D0FFを2でバイナリ追加
PCに$058Bを2でバイナリ追加
PCにPOINTER(返り値)を4でバイナリ追加
PCに$5Dを1でバイナリ追加
PCに$C2を1でバイナリ追加
PCに(型サイズの配列合計)を2でバイナリ追加
//PCに$00を1でバイナリ追加
それ=退避用変数
●型サイズ取得(型の)
型=型を大文字変換
もし、型=「CHAR」ならば1で戻る
もし、型=「BYTE」ならば1で戻る
もし、型=「SHORT」ならば2で戻る
もし、型=「WORD」ならば2で戻る
4で戻る
●バイナリ追加({参照渡し}AにBをサイズで)
MoveMemory(A,POINTER(B),サイズ)
A=A+サイズ
●VirtualAlloc(lpAddress,dwSize,flAllocationType,flProtect) =DLL("kernel32.dll",
"LPVOID VirtualAlloc(
LPVOID lpAddress, // 予約またはコミットしたい領域
SIZE_T dwSize, // 領域のサイズ
DWORD flAllocationType, // 割り当てのタイプ
DWORD flProtect // アクセス保護のタイプ
)")
●VirtualFree(lpAddress,dwSize,dwFreeType) =DLL("kernel32.dll",
"BOOL VirtualFree(
LPVOID lpAddress, // 領域のアドレス
SIZE_T dwSize, // 領域のサイズ
DWORD dwFreeType // 操作タイプ
)")
●MoveMemory(Destination,Source,Length) =DLL("kernel32.dll",
"VOID RtlMoveMemory (
PVOID Destination, // 移動先
VOID *Source, // 移動したいブロック
SIZE_T Length // 移動したいブロックのサイズ
)")
●GetProcAddress(hModule,lpProcName) =DLL("kernel32.dll",
"DWORD GetProcAddress(
HMODULE hModule, // DLL モジュールのハンドル
LPCSTR lpProcName // 関数名
)")
●GetModuleHandle(lpModuleName) =DLL("kernel32.dll",
"HMODULE GetModuleHandleA(
LPCTSTR lpModuleName // モジュール名
)")
----
総合:&counter()
今日:&counter(today)人
昨日:&counter(yesterday)人
#comment()
*情報
作者名:YouTubeダウンロードし放題
引用元:[なでしこプログラム掲示板「代用関数ポインタ」[http://nade.jp-pro.net/bbs/bbs3/cbbs.cgi?mode=al2&number=5747&no=0&KLOG=6]]
[なでしこライブラリ「関数ポインタ」[http://www26.atwiki.jp/isoroku_be/pages/67.html]]
*概要
関数ポインタが最新のなでしこで使えない..って人が多かったので不具合を直しました。
これを使えばなでしこで
-マルチスレッド
-フォームをWinAPIレベルから作成してメッセージループを回す
-非同期な通信
-重い処理の非同期実行
などの高度な処理を実現できます
*[[ダウンロード>http://www26.atwiki.jp/isoroku_be?cmd=upload&act=open&pageid=189&file=%E9%96%A2%E6%95%B0%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E6%94%B9+1.01.nako]]
*変更点
+グローバルからアクセスできるように
+引数の型を指定できるように
*例1: マルチスレッド
終了判定とは整数
テストとは関数ポインタ
これについて
引数型=「」
イベントは~
スレッド2処理
ExitThread(1)
テストで解放
スレッドIDとは整数
CreateThread(0,0,テストのポインタ,0,0,POINTER(スレッドID))
「このようにユーザーを待機する処理の最中に..,」と言う
終了判定=1
●スレッド2処理
500回
もし、終了判定ならば抜ける
母艦=「...ほかの処理をすることもできます 」&今
0.5秒待つ
●CreateThread(lpThreadAttributes,dwStackSize,lpStartAddress,lpParameter,dwCreationFlags,lpThreadId) =DLL("kernel32.dll",
"HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, // セキュリティ記述子
DWORD dwStackSize, // 初期のスタックサイズ
LPTHREAD_START_ROUTINE lpStartAddress, // スレッドの機能
LPVOID lpParameter, // スレッドの引数
DWORD dwCreationFlags, // 作成オプション
LPDWORD lpThreadId // スレッド識別子
)")
●ExitThread(dwExitCode) =DLL("kernel32.dll",
"VOID ExitThread(
DWORD dwExitCode // このスレッドの終了コード
)")
*例2: 窓列挙
ログとはメモ
そのレイアウトは「全体」
テストとは関数ポインタ
これについて
引数型=「HWND,LPARAM」
イベントは~
EnumWindowsProc(引数[0],引数[1])で戻る
EnumWindows(テストのポインタ,0)
テストで解放
●EnumWindowsProc(hwnd,lParam)
バッファとは文字列
バッファに128を確保
GetWindowText(hwnd,POINTER(バッファ),127)
タイトルとは文字列=バッファの(それ)バイト左部分
ログのテキスト=ログのテキスト&
「{hwnd},{タイトル}{~}」
1で戻る
●EnumWindows(lpEnumFunc,lParam) =DLL("user32.dll",
"BOOL EnumWindows(
WNDENUMPROC *lpEnumFunc, // コールバック関数
LPARAM lParam // アプリケーション定義の値
)")
●GetWindowText(hWnd,lpString,nMaxCount) =DLL("user32.dll",
"int GetWindowTextA(
HWND hWnd, // ウィンドウまたはコントロールのハンドル
LPTSTR lpString, // テキストバッファ
int nMaxCount // コピーする最大文字数
)")
*本体
!変数宣言は必要
!NAKO_GROUP_EXEC=GetProcAddress(GetModuleHandle("dnako.dll"),"nako_group_exec");
!関数ポインタ既定イベント名 = "前処理";
■関数ポインタ
・{イベント}イベント
・{整数}ポインタ
・{配列}引数
・{配列}引数型
・ポケット
・タグ
・{非公開}初期化({グループ}参照)~
型サイズ=空
引数型で反復
対象の型サイズ取得を型サイズに配列追加
バッファに64を確保
バッファの01に$55を「BYTE」でバイナリ設定
バッファの02に$EC8Bを「SHORT」でバイナリ設定
バッファの04に$BAを「BYTE」でバイナリ設定
バッファの05にPOINTER(スタック)を「int」でバイナリ設定
バッファの09に$2A89を「SHORT」でバイナリ設定
バッファの11に$68を「BYTE」でバイナリ設定
バッファの12にPOINTER(関数ポインタ既定イベント名)を「int」でバイナリ設定
バッファの16に$68を「BYTE」でバイナリ設定
バッファの17にADDR(参照)を「int」でバイナリ設定
バッファの21に$B8を「BYTE」でバイナリ設定
バッファの22にNAKO_GROUP_EXECを「int」でバイナリ設定
バッファの26に$D0FFを「SHORT」でバイナリ設定
バッファの28に$058Bを「SHORT」でバイナリ設定
バッファの30にPOINTER(返り値)を「int」でバイナリ設定
バッファの34に$5Dを「BYTE」でバイナリ設定
バッファの35に$C2を「BYTE」でバイナリ設定
バッファの36に(型サイズの配列合計)を「SHORT」でバイナリ設定
ポインタ=POINTER(バッファ)
・{非公開}前処理~
TMPとは整数
TMP=スタック+4
(引数型の配列要素数)回
引数[回数-1]=0
TMP=TMP+型サイズ[回数-1]
MoveMemory(POINTER(引数[回数-1]),TMP,型サイズ[回数-1])
返り値=イベント
・{文字列}バッファ
・{整数}スタック
・{配列}型サイズ
・{整数}返り値
●型サイズ取得(型の)
型=型を大文字変換
型で条件分岐
「CHAR」ならば、(8/8)で戻る
「BYTE」ならば、(8/8)で戻る
「WCHAR」ならば、(16/8)で戻る
「SHORT」ならば、(16/8)で戻る
「WORD」ならば、(16/8)で戻る
「INT」ならば、(32/8)で戻る
「UINT」ならば、(32/8)で戻る
「LONG」ならば、(32/8)で戻る
「DWORD」ならば、(32/8)で戻る
「ULONG」ならば、(32/8)で戻る
「LONG_PTR」ならば、(32/8)で戻る
「DWORD_PTR」ならば、(32/8)で戻る
「HWND」ならば、(32/8)で戻る
「LPARAM」ならば、(32/8)で戻る
「WPARAM」ならば、(32/8)で戻る
「COLORREF」ならば、(32/8)で戻る
「PTSTR」ならば、(32/8)で戻る
「PCTSTR」ならば、(32/8)で戻る
「LPTSTR」ならば、(32/8)で戻る
「LPCTSTR」ならば、(32/8)で戻る
「LPVOID」ならば、(32/8)で戻る
「BOOL」ならば、(32/8)で戻る
もし、LEFTB(型,2)=「LP」ならば、4で戻る
もし、LEFTB(型,1)=「P」ならば、4で戻る
もし、LEFTB(型,1)=「H」ならば、4で戻る
「{型} 型は定義されていません」とエラー発生
●関数ポインタ作成(型として)
結果とは変数
結果を関数ポインタとして作成
結果→引数型=型を","で区切る
結果で戻る
関数ポインタ取得用変数とは変数
●関数ポインタ取得(関数名から引数型で)
関数ポインタ取得用変数=引数型として関数ポインタ作成
関数ポインタ取得用変数→初期化(関数ポインタ取得用変数)
実行文とは文字列="関数ポインタ取得用変数→ポケットは~グローバル:{関数名}("
Iとは整数
Iで0から(引数型を","で区切るの配列要素数-1)まで繰り返す
もし、回数>1ならば、実行文に","を追加
実行文に"自身→引数[{I}]"を追加
実行文に")で戻る"を追加
EVAL(実行文)
関数ポインタ取得用変数→イベントは~自身→ポケットで戻る
関数ポインタ取得用変数→ポインタで戻る
●関数ポインタ実行(ポインタ,{配列}引数一覧,引数型,戻値型)
引数型=引数型を「,」で区切る
引数サイズとは配列
引数とは文字列
位置とは整数=1
引数型で反復
引数サイズ[回数-1]=対象の型サイズ取得
引数に(引数サイズの配列合計)を確保
引数一覧で反復
引数の位置にINT(対象)を引数型[回数-1]でバイナリ設定
位置に引数サイズ[回数-1]を直接足す
EXEC_PTR(ポインタ,引数のバイト数,引数,戻値型)で戻る
●GetProcAddress(hModule,lpProcName) =DLL("kernel32.dll",
"DWORD GetProcAddress(
HMODULE hModule, // DLL モジュールのハンドル
LPCSTR lpProcName // 関数名
)")
●GetModuleHandle(lpModuleName) =DLL("kernel32.dll",
"HMODULE GetModuleHandleA(
LPCTSTR lpModuleName // モジュール名
)")
●MoveMemory(Destination,Source,Length) =DLL("kernel32.dll",
"VOID RtlMoveMemory (
PVOID Destination, // 移動先
VOID *Source, // 移動したいブロック
SIZE_T Length // 移動したいブロックのサイズ
)")
!変数宣言は不要
----
総合:&counter()
今日:&counter(today)人
昨日:&counter(yesterday)人
#comment()