2016-11-28 17 views
-1

私はC++とAccessを使い慣れています。私は、プロジェクトからdll(C++でコンパイルされたもの)をAccessから呼び出す作業をしています。 私はどのようにパラメータがDLLに渡されているのか理解したい。dllにパラメータを渡しますか?

dllの入力データはAccessで用意されており、Accessからdllを呼び出します。 "RunFunction"を呼び出すdllに関連付けます。

Results = RunFunction(Data.age, Data.calendar, Data.timesheet, Data.extra) 

DLL準拠CPPコード::cppのコードから、

double __stdcall RunFunction(double * iData, double(*iCalendar)[100], double(*iTimesheet)[100]) 

最初の質問は、私は(C++で)*のiDataを発見し、実際に含まれている は、Accessでの行は、DLLを呼び出しますすべての情報はデータ(アクセス)にあります。 なぜそれが起こる可能性がありますか?私は、Data.ageだけが* iDataに渡され、Data全体には渡されないと考えましたか?

2番目の質問では、AccessのRunFunctionには4つの入力パラメータがありますが、C++には3つしかかかりませんが、なぜこの問題は発生しませんか?

答えて

1

最初に、Data.ageの値がレコード全体またはその他の構造を含むバッファの内部にあると考えてください。だから、その1つの値のアドレスがC++であなたに渡されるときに、隣のアドレスを調べてその中の内容を見ることができます。それをしないでください!

次に、__stdcallの動作を見てください。関数の引数が全く調べられなかったCの初期の段階で設計されました!呼び出し側では、より少ないまたはより多くのパラメータを渡すことができ、スタックを台無しにすることはありません。あなたが余分を渡す場合、大きな問題はありません。あなたがいくつかを残しておけば、関数内の最も右の名前を使用するとゴミ値が与えられ、と表示されると、リターンアドレスが壊れるなど、さまざまな問題が発生する可能性があります。

関連する問題