0

IDE: Code::Blocks コンパイラ: g++ 4.5.4 (Mingw32_i686 から) タイプ アプリケーション: コンソール タイプ

Ok

    // sourcefile: winfunctions.h

    #ifndef __WINFUNCTIONS_H__
    #define __WINFUNCTIONS_H__

    #include <windef.h>
    #include <winbase.h>

    typedef void (__stdcall *F)();
    void StdCall(char *mName, char *fName)();
    typedef void (__stdcall *F_)();
    void StdCall_(char *mName, char *fName)(auto *args[]);
    typedef auto (__stdcall *_F)();
    auto _StdCall(char *mName, char *fName)();
    typedef auto (__stdcall *_F_)();
    auto _StdCall_(char *mName, char *fName)(auto *args[]);

    #endif // __WINFUNCTIONS_H__




    // sourcefile: winfunctions.cpp

    #include "winfunctions.h"

    void StdCall(char *mName, char *fName)()
    {
        HMODULE hM = LoadLibrary(mName);
        F f = (F)GetProcAddress(hM,fName)();
        if (f) f();
        FreeLibrary(hM);
    }

    void StdCall_(char *mName, char *fName)(auto *args[])
    {
        HMODULE hM = LoadLibrary(mName);
        F_ f = (F_)GetProcAddress(hM,fName)(args);
        if (f) f(args);
        FreeLibrary(hM);
    }

    auto _StdCall(char *mName, char *fName)()
    {
        HMODULE hM = LoadLibrary(mName);
        _F f = (_F)GetProcAddress(hM,fName)();
        if (f) return f();
        FreeLibrary(hM);
    }

    auto _StdCall_(char *mName, char *fName)(auto *args[])
    {
        HMODULE hM = LoadLibrary(mName);
        _F_ f = (_F_)GetProcAddress(hM,fName)(args);
        if (f) return f(args);
        FreeLibrary(hM);
    }

コードを示しますが、期待どおりに動作しません。このコードは私の欲求を示すはずです。

4 つのラッパー関数を使用して winapi 関数を発生させたいと考えています。

F- 関数は何も返さず、入力パラメータもありません

F_- 関数は何も返さないが、入力パラメータを持っている

_F- 関数は値を返しますが、入力パラメータがありません

_F_- 関数は値を返し、入力パラメータを持ちます

コンパイル時ではなく、関数の戻り値の型とランタイム関数に渡されるパラメーターの型を定義したいと考えています。

もちろん、コンパイル時に関数に渡されるパラメーターの数も決定したくありません。

何か案は?これは可能ですか?

更新:

ありがとうロドリゴ

libffi 3.0.6 win32 (テスト コンソール アプリケーションで libffi.dll.a とヘッダー ファイルを使用) をダウンロードしましたが、「libffi-5.dll が見つかりません」という警告が表示されました。

http://rpm.pbone.net/index.php3/stat/4/idpl/24142309/dir/fedora_16/com/mingw32-libffi-3.0.9-2.fc15.noarch.rpm.htmlをダウンロードし、解凍しました、C:\Mingw32\bin にこの .dll のコピーである libffi-5.dll が見つかりました。

テストのコード:

#include <iostream>
#include <stdio.h>
#include <windows.h>
#include "ffi.h"

int main()
{
     ffi_cif cif;

            HINSTANCE dllHandle = LoadLibrary("user32.dll");

            int n = 4;

            ffi_type *ffi_argTypes[4];
            void *values[4];
            UINT64 a=0;
            UINT32 b=0;
            TCHAR* s1= "hello";
            TCHAR* s2= "hello2";
            values[0] = &a;
            values[1] = &s1;
            values[2] = &s2;
            values[3] = &b;
            ffi_argTypes[0] = &ffi_type_uint64;
            ffi_argTypes[1] = &ffi_type_pointer;
            ffi_argTypes[2] = &ffi_type_pointer;
            ffi_argTypes[3] = &ffi_type_uint;
            ffi_type *c_retType = &ffi_type_sint;
            ffi_type rc; // return value
            if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &ffi_type_sint, ffi_argTypes) == FFI_OK)
            {
                ffi_call(&cif, FFI_FN(GetProcAddress(dllHandle,"MessageBoxA")), &rc, values);
            }

       return 0;

     }

はい!私は働くコードを持っています!

私はこの問題を引き続き研究します。

4

0 に答える 0