入力画面で指定されたDLLファイルの関数を実行したいです。
画面からDLLファイルのバス、名前、関数名、リターンデータタイプ、引数のデータタイプ
を得られるです。
DLLファイルのインポート、関数のロード、リターン値の処理はわかるですが、
引数の処理方法はいまいちです。
例え
定義ときは:
typedef float(WINAPI *RtDWParaFloat)(...);で
コール時の方法は教えてください
前文がよく理解できないのですが、とりあえず インポートした関数の
呼び出した
float f;
f = RtDWParaFloat(...);
でOKです。
コンパイルするときに、関数ポインタの場合引数の数や、型をチェック
しないので気を付けてください。
外していたらごめんなさい。
済みません、日本語を下手ですから、
具体な使用場面で説明します。
あるアプリケーションは使用者で任意指定されているDLLファイルの関数を実行したいです
指定方法は一つユーザインタフェースダイアログ画面を使用者に提供する
このユーザインタフェースダイアログ画面はDLLファイルのバス、名前、関数名、
リターンデータタイプ、引数のデータタイプを使用者で入力する。
アプリケーションはこの入力されたDLLの関数を実行すること。
アプリケーションはコンパイルするときにはどのDLLファイルか、
どの関数かまた分かりません。
LoadLibrary(),GetProcAddress()でDLLファイルをロードする、関数をゲットすることが
できるですが、
typedef float(WINAPI *RtDWParaFloat)(...);
typedef int (WINAPI *RtDWParaInt)(...);
...
typedef double(WINAPI *RtDWParaDouble)(...);
あらかじめ上記ような定義しておいて、使用者を指定された関数タイプを合わせて、関数
ゲットすることができるですが、
問題は引数を関数に渡す方法がわかりません、教えてください。
Rundll32.exeみたいなことをやりたいのですか?
基本的に,C/C++では無理です。
アセンブラを使えば出来ないことはないですが……。
そうです、Rundll32.exeみたいなことをやりたいのです
Rundll32.exeの使用方法が教えてください。
そうです、Rundll32.exeみたいなことをやりたいのです
Rundll32.exeの使用方法が教えてください。
>>DLLファイルのインポート、関数のロード、リターン値の処理はわかるですが
内容が漠然としてますね?
自作のみですか、他作も利用しますか
MFCDLLですか、MFC拡張DLLですか、
C++で作成しクラスを含んでいますか、Cのみで作成されていますか
不明ですか
C・C++以外で作成されたものですか
RUNTimeクラスでオブジェクト名取得できませんでしたっけ?
LoadLibraryはしっているんですよね
「Inside Visual C++ V5」の985ページ参考になりませんか
MFCDLLです,C++で作成しクラスを含んでいます.
Inside Visual C++ V5はVC++ V5のマニュアルですか。
情報提供頂いて、有賀と御座います。
MFCDLLです,C++で作成しクラスを含んでいます.
Inside Visual C++ V5はVC++ V5のマニュアルですか。
情報提供頂いて、有賀と御座います。
マニュアルじゃないよ
書店に行けばコンピュータコーナーにたいがいおいてあるよ
アスキー出版 マイクロソフトプレス 値段 9400
の本だよ
とりあえず,メンバ関数を呼ぶのは基本的にまずいでしょう。
まぁ,本来の順番を真似ればいいのですが。
つまり,何らかの方法でメモリを確保し,
#クラスがoperator newを持っているなら,それを呼ぶ。
次にコンストラクタを呼び,
そこで,メンバ関数を呼ぶ。
最後に,デストラクタも呼ぶ必要があります。
これらは,Rundll32.exeをsystemやらCreateProcessやらで呼び出す方法では実現不可能
です。
とりあえず,簡単な振り分けだけ。
・関数の型が絞れる場合
→ifなどで振り分けて呼び出す
・関数の型が絞れない場合
→インラインアセンブラでゴリゴリと……。
後者は,アセンブラでのプログラム経験が無いならお勧めしません。