構成可能なレポート印刷ダイアログを作成するというアイデアがありました。たとえば、リストボックスを作成し、データベースに登録されている利用可能なレポートを読み取ります。次に、ユーザーはリストボックス内の 1 つの項目をクリックして、印刷をクリックするだけです (この質問のため、レポートのパラメーターは省略します)。新しいレポートの追加は、データベースに新しい dll を登録するのと同じくらい簡単です。すべてのレポート dll には、一般的な名前の PrintReport 関数が必要です。
また、これらの dll を作成するプログラマーにとって、印刷は簡単なはずです。gdiplus 描画に使用できるオブジェクトへのポインターが与えられます。
これが私がしたことです:
- 上記のダイアログを作成しました
- 名前空間 (PRINTOUT) とその中にいくつかのクラスを作成しました (そのうちの 1 つは、完全に初期化された Gdiplus::Graphics オブジェクトと、印刷プレビューに使用されるメタファイルへのポインターのベクトルを含む Print です)。
次のように宣言されているdllでこのユニバーサル関数を作成しました。
extern "C" __declspec(dllexport) int PrintReport(PRINTOUT::Print *prn, LONG_PTR ReportData);
次に、オブジェクトを作成し、次の方法で dll ライブラリを呼び出しました。
typedef BOOL (*tFUNC)(PRINTOUT::Print *, LONG_PTR); tFUNC fFUNC=reinterpret_cast<tFUNC>(GetProcAddress(LibInst, "PrintReport")); //as a pointer, because i will delete it before unloading a dll. Dll loading code omitted. PRINTOUT::Print *prn=new PRINTOUT::Print(); //this should print using gdiplus object pointer contained in the prn //after printing this function just exits fFUNC(prn, RpData); //cleanup within destructor delete prn; FreeLibrary(LibInst);
問題: dll 内の関数は、 prnオブジェクト内に含まれるベクトルのアドレスが完全に異なりますが、その理由がわかりません。実際、私は PRINTOUT::Print prn を宣言し、参照渡し fFUNC(&prn, RpData) を宣言しようとしましたが、違いはほとんどまたはまったくありませんでした。なぜこれが起こるのか私に説明してみてください。prnオブジェクトのアドレスは同じですが、内部のアドレスが異なります。
よろしく Kitet