MFCで作成したEXEプロジェクトをVC6からVC2005へ移植しているのですが、以下のリンクエラーが解決できない状況です。
開発環境:Windows2000(SP4)、VisualStudio2005 Pro
-------------- ここから --------------
リンクしています...
CreateBarCodeObjectDlg.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >
__thiscall CBarCodeObjectRec::GetDefaultValue(void)" (__imp_?GetDefaultValue@CBarCodeObjectRec@@QAE?AV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@XZ) が関数
"private: void __thiscall CCreateBarCodeObjectDlg::ReflectValue(void)" (?ReflectValue@CCreateBarCodeObjectDlg@@AAEXXZ) で参照されました。
ObjectPropBarCodePg.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) public: class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >
__thiscall CBarCodeObjectRec::GetDefaultValue(void)" (__imp_?GetDefaultValue@CBarCodeObjectRec@@QAE?AV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@XZ)" は未解決です。
Functions.obj : error LNK2019: 未解決の外部シンボル "__declspec(dllimport) public: static struct CRuntimeClass * __stdcall CStaticFieldObjectRec::GetThisClass(void)"
(__imp_?GetThisClass@CStaticFieldObjectRec@@SGPAUCRuntimeClass@@XZ) が関数
"class CSize __cdecl GetTextFitSize(class CCommonFieldObjectRec *,char const *,int,char const *,int,int,char)"
(?GetTextFitSize@@YA?AVCSize@@PAVCCommonFieldObjectRec@@PBDH1HHD@Z) で参照されました。
-------------- ここまで --------------
リンク先のDLLはVC6で作成したものです。移植前(VC6)ではリンクできます。
CBarCodeObjectRec::GetDefaultValue(void)の宣言、定義共に確認したのですが、記述漏れはありませんでした。
CStaticFieldObjectRec::GetThisClass(void)に関しては宣言、定義共にありませんでした。
プロジェクトのプロパティの「リンカ」の設定変更が必要なのでしょうか?
アドバイス宜しくお願いいたします。
VC6でどのようにしてDLLを作成しましたか?
「共有 DLL で MFC を使用」
で作成されているDLLの場合、MFCの互換が取れなくて失敗するとかあるかもしれません。
なんか、上の回答はあんまり意味なさそう。
とりあえず、インタフェースとしてMFCのクラスを使うのが不味いのかなぁ
と思います。
VBとかでも使えるような型を使うべきなのかな。
(CStringじゃなくて、LPSTRとか、BSTRとか。配列ならSAFEARRAYとか)
それが面倒であれば、DLLもVS2005で作り直すべきでしょう。
「共有 DLL で MFC を使用」で作成されたDLLだったので、
「MFC のスタティックライブラリを使用」に変更し、リビルドしました。
その際、ランタイムライブラリに関するエラーが出たので、マルチスレッドデバッグ(MTd)からマルチスレッドDLL(MD)に変更しました。
リビルドしたDLLとのリンクを試みたのですが、結果は変わりませんでした。
リンクエラーについてはEXEプログラム側を修正して回避させました。
次にデバッグ実行を試みましたが、DLL側でAfxGetAppName()を実行した時にエラーとなりました。
タイトルと異なる内容の質問になりますが、VC2005で作成したEXEとVC6で作成したDLLをリンクして動作させるのは、そもそも無理なことなのでしょうか?
ツイート | ![]() |