Dll関数の呼び出し方法 – プログラミング – Home

通知
すべてクリア

Dll関数の呼び出し方法


jx,zhang
 jx,zhang
(@jx,zhang)
ゲスト
結合: 23年前
投稿: 6
Topic starter  

入力画面で指定されたDLLファイルの関数を実行したいです。
画面からDLLファイルのバス、名前、関数名、リターンデータタイプ、引数のデータタイプ
を得られるです。

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

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


引用解決済
トピックタグ
Joan
 Joan
(@Joan)
ゲスト
結合: 23年前
投稿: 42
 

前文がよく理解できないのですが、とりあえず インポートした関数の
呼び出した

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

でOKです。

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

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


返信引用
jx,zhang
 jx,zhang
(@jx,zhang)
ゲスト
結合: 23年前
投稿: 6
Topic starter  

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

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

Rundll32.exeみたいなことをやりたいのですか?

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


返信引用
jx,zhang
 jx,zhang
(@jx,zhang)
ゲスト
結合: 23年前
投稿: 6
Topic starter  

そうです、Rundll32.exeみたいなことをやりたいのです
Rundll32.exeの使用方法が教えてください。


返信引用
jx,zhang
 jx,zhang
(@jx,zhang)
ゲスト
結合: 23年前
投稿: 6
Topic starter  

そうです、Rundll32.exeみたいなことをやりたいのです
Rundll32.exeの使用方法が教えてください。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

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

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


返信引用
jx,zhang
 jx,zhang
(@jx,zhang)
ゲスト
結合: 23年前
投稿: 6
Topic starter  

MFCDLLです,C++で作成しクラスを含んでいます.
Inside Visual C++ V5はVC++ V5のマニュアルですか。
情報提供頂いて、有賀と御座います。


返信引用
jx,zhang
 jx,zhang
(@jx,zhang)
ゲスト
結合: 23年前
投稿: 6
Topic starter  

MFCDLLです,C++で作成しクラスを含んでいます.
Inside Visual C++ V5はVC++ V5のマニュアルですか。
情報提供頂いて、有賀と御座います。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

マニュアルじゃないよ
書店に行けばコンピュータコーナーにたいがいおいてあるよ
アスキー出版 マイクロソフトプレス 値段 9400
の本だよ


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

とりあえず,メンバ関数を呼ぶのは基本的にまずいでしょう。
まぁ,本来の順番を真似ればいいのですが。

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました