■関数ポインタ改

「■関数ポインタ改」の編集履歴(バックアップ)一覧はこちら

■関数ポインタ改 - (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()

表示オプション

横に並べて表示:
変化行の前後のみ表示:
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。