No.10ベストアンサー
- 回答日時:
>DLLの中で 関数名が同じで引数が異なる関数を用意したいのですが
単純には不可能。
C++で「引き数が異なる、同一の名前の関数」は「ソースコード上でのみ、同じ名前に見える、異なる関数」です。
DLLを明示的リンクで呼ぶ限り「名前がどうなってようが、引き数が違う関数は、異なる関数」にするしかありません。
それか「printf(char *format, ...)」のように「不定個の引き数」で定義するか(つまり、最初の引き数の中身で、2個目以降の引き数の扱いを変える)
C++で
func();
と書いた時と
func(1,2);
と書いた時、別々の関数が呼ばれるのは、機械語になった時点で
CALL FAR PTR CS:_func_VOID
と
PUSH 2
PUSH 1
CALL FAR PTR CS:_func_INT_INT
ADD ESP,8
のように「内部的に違うラベルが付いたアドレスをCALLしてくれる」からです。
つまり「本当は違うアドレスをコールして欲しいけど、C++ソース上では同じ名前にしても良いよね。実際に呼ぶアドレスはコンパイラがどっちか判断してね」って事なのです。
これをDLLの明示的リンクでやるのは不可能です。
序数124のDLL関数を、引き数無しで
CALL FAR PTR _DLL_ENTRY_POINT_124
と呼ばれたか、引き数2つで
PUSH 2
PUSH 1
CALL FAR PTR _DLL_ENTRY_POINT_124
ADD ESP,8
と呼ばれたかは、呼ばれた先の「_DLL_ENTRY_POINT_124」では判断できません。
スタック上に並んでいる値が何なのかは、呼ばれた方は判りません。
呼ばれた先では「俺は引き数が3つの筈だ!3つあるとして動く!」と言うように、引き数固定で動作するしかないのです。
「機械語で、どういう命令コードが生成されるか」が判っていれば、簡単に「出来ねえ、不可能」って判る話なのですが。
No.9
- 回答日時:
質問の内容が少々ずれてきているような気がするのですが、
何を質問したいのか、整理出来ていますか?
クラスライブラリをDLLにして、外部から呼び出す方法として、良くあるのは、
DLLよりExportするインターフェイス部分には、extern"C"を使用しておいて、
関数を用いて、C++のクラスを生成するファクトリーを戻したりします。
No.8
- 回答日時:
GetProcAddress()でオーバーロード関数を使用したい、ということですか。
オーバーロードは引数まで含めた情報を使ってコンパイラで静的に解析する(このときにC++シンボル名への変換もされる)から可能なのであって、引数情報なし・実行時動的解析の明示的リンクではどうしようもありません。
シンボル名だけで検索するのに、同じシンボル名がDLLに複数あったら何を返していいのかわかりませんよね?
No.7
- 回答日時:
> オーバーロード機能が使用できないのでは
質問内容的には、明示的リンクでオーバーロードさせたい
という事だったのでしょうか?
そもそも名前の通り、リンクする対象を明示的に指定させるので、
オーバーロードはでき無いと思います。
#これは序数であっても、同じです。
明示的にリンクするとは、
装飾名も含めて明示的でなければなりません。
No.6
- 回答日時:
ここでの関数とは、グローバル関数でC++のクラス内のメンバー関数の呼び出しではないんですよね。
グローバル関数であれば、他の方の回答の通り、extern "C" をつける方法が一般的だと思います。
明示的リンクという条件から外れますが、こんな方法もあります。
DLLを遅延ロード設定をすると、関数をコールするときに自動的にLoadLibrary() & GetProcAddress() を呼ばせることが可能です。
この回答へのお礼
お礼日時:2008/11/20 13:02
回答ありがとうございます。
extern "C"を用いると
オーバーロード機能が使用できないのでは?
DLLの中で 関数名が同じで引数が異なる関数を用意したいのですが
DLLの遅延ロード設定が設定があるとは知りませんでした。
教えていただいてありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- Excel(エクセル) 関数式を教えてください。 AとBのセルがあり、Aのセルに値がある場合はCのセルへ1と表示。 AとBの 5 2022/03/23 14:38
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- Excel(エクセル) Excel2019、2021の日付、曜日の表示について 2 2022/11/29 15:01
- Excel(エクセル) フォルダ内のエクセルファイルを開かずにデータ採取する関数式 2 2022/12/22 22:15
- その他(OS) OBSが起動できません 3 2022/03/30 12:21
- その他(Microsoft Office) エクセルのマクロについて教えてください。 5 2023/01/21 09:39
- 数学 ベクトル空間であることの証明の際に10このベクトル空間を使用すると思います。その時に文字は太くなりま 2 2022/07/29 04:15
- フリーソフト cygewf-2.dllがない、と表示され、ダウンロードしたファイルが動作しない 2 2023/03/27 11:05
- 数学 『Cの微分.2』 3 2023/02/15 19:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ソフトの開発言語を調べる方法
-
C++でデスクトップGUIアプリ開...
-
unsigned long long 型のフォー...
-
2つのマシンでコンパイルしたld...
-
for文内での変数定義
-
Σの計算について
-
C言語でのコンパイラの作成方法
-
HP-UXのプログラムをSolaris、R...
-
COBOL計算式の中間ワーク桁数に...
-
CとC++の変数宣言について
-
C言語 入出力ファイルの読み書...
-
Visual Studio でmakefileを使...
-
C言語はC言語でできている?
-
中国語(簡体字)をソースコード...
-
DOSの文字の色を変える方法。
-
リリースモードとデバッグモー...
-
COBOLの論理演算子について
-
python エラー
-
エクセルのエラーメッセージ「4...
-
<math.h>があるのにsqrtが・...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
unsigned long long 型のフォー...
-
ソフトの開発言語を調べる方法
-
C++でデスクトップGUIアプリ開...
-
組み込みソフト。ROM領域にデータ
-
cc と gcc の違い
-
C++Builder → Visual C++ 移植...
-
printfなど、標準関数のソース...
-
COBOLのALPHABET...
-
COBOLの論理演算子について質問...
-
cobolで実行環境って何ですか?
-
Visual Studio でmakefileを使...
-
パーサとコンパイラの違いって?
-
昔のgraph.hというファイル
-
未使用引数の注意文出力を回避...
-
C言語でのコンパイラの作成方法
-
C言語はC言語でできている?
-
COBOL計算式の中間ワーク桁数に...
-
リリースモードとデバッグモー...
-
『Bin』ディレクトリは何の略語?
-
POWERCOBOLのSQL...
おすすめ情報