Dll関数の呼び出し方法

[戻る]
jx,zhang [E-Mail] 2002/04/13(土) 19:52:50
入力画面で指定されたDLLファイルの関数を実行したいです。
画面からDLLファイルのバス、名前、関数名、リターンデータタイプ、引数のデータタイプ
を得られるです。

DLLファイルのインポート、関数のロード、リターン値の処理はわかるですが、
引数の処理方法はいまいちです。
例え
定義ときは:
typedef float(WINAPI *RtDWParaFloat)(...);で


コール時の方法は教えてください

Joan 2002/04/14(日) 14:07:10
前文がよく理解できないのですが、とりあえず インポートした関数の
呼び出した

float f;
f = RtDWParaFloat(...);

でOKです。

コンパイルするときに、関数ポインタの場合引数の数や、型をチェック
しないので気を付けてください。

外していたらごめんなさい。

jx,zhang [E-Mail] 2002/04/14(日) 20:30:22
済みません、日本語を下手ですから、
具体な使用場面で説明します。
あるアプリケーションは使用者で任意指定されているDLLファイルの関数を実行したいです
指定方法は一つユーザインタフェースダイアログ画面を使用者に提供する
このユーザインタフェースダイアログ画面はDLLファイルのバス、名前、関数名、
リターンデータタイプ、引数のデータタイプを使用者で入力する。
アプリケーションはこの入力されたDLLの関数を実行すること。

アプリケーションはコンパイルするときにはどのDLLファイルか、
どの関数かまた分かりません。
LoadLibrary(),GetProcAddress()でDLLファイルをロードする、関数をゲットすることが
できるですが、
typedef float(WINAPI *RtDWParaFloat)(...);
typedef int (WINAPI *RtDWParaInt)(...);
...
typedef double(WINAPI *RtDWParaDouble)(...);
あらかじめ上記ような定義しておいて、使用者を指定された関数タイプを合わせて、関数
ゲットすることができるですが、
問題は引数を関数に渡す方法がわかりません、教えてください。

YuO [E-Mail] 2002/04/14(日) 22:40:45
Rundll32.exeみたいなことをやりたいのですか?

基本的に,C/C++では無理です。
アセンブラを使えば出来ないことはないですが……。

jx.zhang [E-Mail] 2002/04/15(月) 20:54:36
そうです、Rundll32.exeみたいなことをやりたいのです
Rundll32.exeの使用方法が教えてください。

jx.zhang [E-Mail] 2002/04/15(月) 20:54:36
そうです、Rundll32.exeみたいなことをやりたいのです
Rundll32.exeの使用方法が教えてください。

wood 2002/04/16(火) 06:50:16
>>DLLファイルのインポート、関数のロード、リターン値の処理はわかるですが
内容が漠然としてますね?
自作のみですか、他作も利用しますか
MFCDLLですか、MFC拡張DLLですか、
C++で作成しクラスを含んでいますか、Cのみで作成されていますか
不明ですか
C・C++以外で作成されたものですか

RUNTimeクラスでオブジェクト名取得できませんでしたっけ?
LoadLibraryはしっているんですよね
「Inside Visual C++ V5」の985ページ参考になりませんか

jx.zhang [E-Mail] 2002/04/17(水) 13:16:07
MFCDLLです,C++で作成しクラスを含んでいます.
Inside Visual C++ V5はVC++ V5のマニュアルですか。
情報提供頂いて、有賀と御座います。

jx.zhang [E-Mail] 2002/04/17(水) 13:16:07
MFCDLLです,C++で作成しクラスを含んでいます.
Inside Visual C++ V5はVC++ V5のマニュアルですか。
情報提供頂いて、有賀と御座います。

wood 2002/04/17(水) 22:54:36
マニュアルじゃないよ
書店に行けばコンピュータコーナーにたいがいおいてあるよ
アスキー出版 マイクロソフトプレス 値段 9400
の本だよ

YuO [E-Mail] 2002/04/18(木) 02:43:13
とりあえず,メンバ関数を呼ぶのは基本的にまずいでしょう。
まぁ,本来の順番を真似ればいいのですが。

つまり,何らかの方法でメモリを確保し,
#クラスがoperator newを持っているなら,それを呼ぶ。
次にコンストラクタを呼び,
そこで,メンバ関数を呼ぶ。
最後に,デストラクタも呼ぶ必要があります。


これらは,Rundll32.exeをsystemやらCreateProcessやらで呼び出す方法では実現不可能
です。

とりあえず,簡単な振り分けだけ。
・関数の型が絞れる場合
→ifなどで振り分けて呼び出す
・関数の型が絞れない場合
→インラインアセンブラでゴリゴリと……。

後者は,アセンブラでのプログラム経験が無いならお勧めしません。

古いスレッドには追加発言できません。