VC6⇒VC2005移植でリンクエラー(LNK2019)


redegg  2006-12-14 00:44:16  No: 63942

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)に関しては宣言、定義共にありませんでした。

プロジェクトのプロパティの「リンカ」の設定変更が必要なのでしょうか?
アドバイス宜しくお願いいたします。


Blue  2006-12-14 00:49:53  No: 63943

VC6でどのようにしてDLLを作成しましたか?
「共有 DLL で MFC を使用」
で作成されているDLLの場合、MFCの互換が取れなくて失敗するとかあるかもしれません。


Blue  2006-12-14 01:20:58  No: 63944

なんか、上の回答はあんまり意味なさそう。

とりあえず、インタフェースとしてMFCのクラスを使うのが不味いのかなぁ
と思います。
VBとかでも使えるような型を使うべきなのかな。
(CStringじゃなくて、LPSTRとか、BSTRとか。配列ならSAFEARRAYとか)

それが面倒であれば、DLLもVS2005で作り直すべきでしょう。


redegg  2006-12-14 01:27:19  No: 63945

「共有 DLL で MFC を使用」で作成されたDLLだったので、
「MFC のスタティックライブラリを使用」に変更し、リビルドしました。
その際、ランタイムライブラリに関するエラーが出たので、マルチスレッドデバッグ(MTd)からマルチスレッドDLL(MD)に変更しました。

リビルドしたDLLとのリンクを試みたのですが、結果は変わりませんでした。


redegg  2006-12-14 20:12:59  No: 63946

リンクエラーについてはEXEプログラム側を修正して回避させました。

次にデバッグ実行を試みましたが、DLL側でAfxGetAppName()を実行した時にエラーとなりました。

タイトルと異なる内容の質問になりますが、VC2005で作成したEXEとVC6で作成したDLLをリンクして動作させるのは、そもそも無理なことなのでしょうか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加