0

皆さんこんにちは。xls を txt に変換する古いユーティリティを使用する必要があります。ユーティリティのロジックに小さな問題がありましたが、問題は別のところにあります... ユーティリティは、exe モジュールと dll モジュールの 2 つの部分で構成され、MFC を使用します。

exeプロジェクトでは

pInit = (t_bXR_Init)GetProcAddress(hExcel, _T("bXR_Init"));

pInit("logfiles",false);

dll プロジェクトでは、

typedef bool (*t_bXR_Init) (CString const &strlogfilespath, bool btxtfile); XLSREADER_API bool bXR_Init(CString const &strlogfilespath, bool btxtfile);

問題は、引数を関数に送信すると、引数"logfiles"が取得されないことです。他のすべてのパラメーターが適切に送信されているため、それは奇妙です。

その理由は、CString の使用に関係しています。しかし、方法がわからない...

XLSREADER_API は次のように定義されています。

#define XLSREADER_API extern "C" __declspec(dllimport)

また、追加しました

AFX_MANAGE_STATE(AfxGetStaticModuleState());

関数本体の先頭 (bXR_Init 用)。しかし、それは役に立ちませんでした。

また、これら 2 つのプロジェクトのいくつかの設定を変更しようとしましたが、すべての設定は同じです (たとえば、変換の呼び出しは __cldecl(/Gd) です。デバッグ バージョンの exe と dll をビルドするか、リリース バージョンの exe と dll を同時にビルドします)。

また、同じ状況CStringで - の代わりに使用しようとしました。CString&使えばちゃんと動くのですchar*が、上司はまずどこが悪いのか調べろと言います。

何が問題につながる可能性がありますか (関数は CString パラメーターを取得しません)?

4

3 に答える 3

0

実際のCStringパラメーターを呼び出しに渡してみてください。

CString sPath = "logfiles";
pInit(sPath,false);
于 2013-07-31T14:26:18.980 に答える
0

DLL 境界を越えて CString などの複雑な型を渡すには、DLL と exe の両方がまったく同じ DLL ライブラリを使用していることを確認する必要があります。「ランタイム ライブラリ」をマルチスレッド DLL に設定し、「MFC の使用」を共有 DLL で MFC を使用するように設定します。また、デバッグ モジュールとリリース モジュールを混在させないでください。両方が同じでなければなりません。

これらの条件がなければ、2 つの異なるヒープが得られ、2 つのヒープと互換性のある割り当て/削除を維持することはできません。

于 2013-07-30T14:45:54.800 に答える
0

ぶっちゃけ!(f はどうなっているのか)

問題は解決された。

exeプロジェクトには「文字セット」=「マルチバイト文字セットを使用」があり、dllプロジェクトには「文字セット」=「ユニコード文字セットを使用」があることがわかりました。

そのため、dll 関数は内部に char* を含む CString を取得しましたが、内部に wchat_t* を含む CString と見なしました。そして、それはゴミのように見えました(私のPCでは完全なゴミとして、同僚のPCでは中国語の記号として)。

exe プロジェクトの「文字セット」を「Unicode 文字セットを使用」に変更したところ、約 60 個のエラーが見つかりました。次に、 http://habrahabr.ru/post/164193/の記事を読みました(ロシア語または英語: http://www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR -LPCTSTR-etc )。

そして、すべてのエラーを修正し、TCHAR.h から広く使用されているマクロを修正しました (MSDN が私を助けてくれました)。

助けてくれてありがとう。

于 2013-08-02T13:04:01.840 に答える