
VS2008です。
Library: NativeC++ with MFC -> DLL
↑↓
Wrapper: C++/CLI with .NET -> DLL
↑↓
Appli: VB.NET with .NET -> EXE
元々、ActiveXコントロール(非GUI利用)だったNativeC++で書かれたLibraryを
MFC DLLとしてビルドし、Wrapper 経由で Appli から使用できるよう
移植をしています。
Library から必要な関数を dllexport し、wrapper から参照し、
wrapper を Appli が参照して、使用できるようにしました。
int型を引数に取り、結果として返す関数は期待どおり動作しますが、
文字列だと上手く行きません。
Wrapper/Appli は System.CString で統一したいのですが、
Library ではどのような型として宣言すれば文字列のやり取りができるでしょうか。
( 引数・戻値の両者 )
CString wchar_t* char* System.String ALT::CStringT basic_string _bstr_t CComBSTR
LPCTSTR LPTSTR PCTSTR PTSTR LPCWSTR LPWSTR PCWSTR PWSTR BSTR…
なお、Library で下記のようにエクスポートし
__declspec(dllexport) BSTR test(LPCTSTR data);
wrapper で
BSTR hoge(LPCTSTR value){ return test(value); }
と宣言すると、wrapperのビルドで下記のエラーが表示されます。
エラー1error LNK2028: 未解決のトークン (0A000B39)
"wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が
関数 "public: wchar_t * __clrcall wrap::hoge(wchar_t const *)"
(?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。wrapper.objwrapper
エラー2error LNK2019: 未解決の外部シンボル
"wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が
関数 "public: wchar_t * __clrcall wrap::hoge(wchar_t const *)"
(?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。wrapper.objwrapper
エラー3fatal error LNK1120: 外部参照 2 が未解決です。
No.3ベストアンサー
- 回答日時:
Library の DLL に対して
Dumpbin /exports XXXXX.dll
とするとどうなりますか?
ご回答ありがとうございます。根本的な解決には至りませんが、 急務だった為、以下のようなメソッドをwrapper側に実装し、appliとlibraryの間を取り持つようにしました。
/* System::String 型を char* 型にする */
void string2charpt(System::String^ str, char* c)
{
cli::array<wchar_t>^ wch = str->ToCharArray();
*c = '\0';
for ( int i ; i < wch->Length ; i++ ){
*(c+i) = wch[i];
*(c+i+1) = '\0';
}
}
void charpt2string(char* c, System::String^ str)
{
int i;
str = System::String::Empty;
for ( i = 0; *(c+i) != '\0'; i++ )
str += *(c+i);
}
No.2
- 回答日時:
すみません、エラーメッセージの __cdecl を __clrcall と見間違えてしまっていたため、
とんちんかんな回答になってしまいました。
wrapper 側から __cdecl で呼ぼうとしていたんですね。
試しに Visual Studio 2008 で
C/C++ Native DLL で
__declspec(dllexport) BSTR test( LPCTSTR data )
{
return ( BSTR )data;
}
とし ( /Gd )、C++/CLI Windows フォームアプリケーションで
extern BSTR __cdecl test( LPCTSTR value );
と宣言して
BSTR bstr = test(_T("Test"));
のようにすると、ビルドも実行もエラーなく正常に実行できました。
int 型の関数は正常に実行出来ているということは、.lib が正しく指定されていないというわけでもなさそうですし、不思議ですね・・・。
Wrapper のプロジェクトで参照している .lib が更新されていないということはありませんか?
この回答への補足
確認をしたところ、ちゃんと更新されているようです。質問文の「int型を引数に取り、結果として返す関数は期待どおり動作」は、具体的には int add(int a, int b){ return a+b; } でした。文字列では上手くいかないので、とりあえず、他の型は?と考えて試してみたところ、float型引数を6個取りintを返す int piyo(float x., float y, float z, float vx, float vy, float vz) でも、同じ「未解決のトークン/シンボル」となりました。型も名前も合っていて、libもちゃんと参照できているはずですが、どうしたものか…。
補足日時:2011/10/28 11:12No.1
- 回答日時:
C++/CLI 側 ( wrapper 側 ) ではデフォルトで __clrcall になるので
extern BSTR __cdecl test( LPCTSTR value );
のように宣言しないとダメみたいですね。
この回答への補足
ふむふむ。Library、Wrapperの両方とも、念の為に/Gdオプション付きでコンパイルしてました。
Library: __declspec(dllexport) extern BSTR __cdecl test(LPCTSTR value);
Wrapper: BSTR hoge(LPCTSTR value){ return test(value); }
上記のように変更してみたところ、次のエラーが表示されました。
エラー14error LNK2028: 未解決のトークン (0A000B5B) "wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が関数 "public: wchar_t * __clrcall C3dlib::hoge(wchar_t const *)" (?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。
エラー15error LNK2019: 未解決の外部シンボル "wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が関数 "public: wchar_t * __clrcall C3dlib::hoge(wchar_t const *)" (?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。
エラー16fatal error LNK1120: 外部参照 2 が未解決です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- JavaScript Javascript初心者|jQueryの.val()で値を取得し複数の要素を連結させる方法知りたい 2 2022/06/02 12:06
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- C言語・C++・C# c言語 配列とポインタについて 3 2023/02/09 22:53
- HTML・CSS ヘッダーの画像にメインエリアがかぶってしまいます 1 2022/11/28 14:06
- Visual Basic(VBA) Excel VBAで教えてください 4 2022/05/11 22:20
- Visual Basic(VBA) Changeイベントで複数セルへの貼り付けおよび値削除時に1個目のセルのみエラーになる 3 2022/12/21 09:07
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Excel(エクセル) エクセルからスプレッドシートに数式を移植で起こるエラーについて。 2 2023/08/05 10:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
外部依存関係について
-
LNK2019: 外部シンボル どのよ...
-
LNK2001(Pro*c)
-
ilink32について。'__setargv__...
-
MFC C++ と C++/CLI の文字列
-
wsprintfのエラーについて
-
外部シンボル未解決 LNK2001
-
外部シンボルの未解決のエラー
-
『外部シンボル~未解決です。...
-
リンカのエラー
-
Windowsアプリケーションをどう...
-
Visual C++6.0を使っていての質問
-
エラー 未解決の外部シンボル
-
C++ Builderでユニットの追加
-
error LNK2001について
-
C言語のエラー LNK1120: 外部参照
-
C++でのエラー LNK2001
-
ビルドする時のエラー。(初心...
-
コンパイルエラー
-
gdiplusのリンクエラー
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
外部依存関係について
-
外部シンボル" ~~"は未解決で...
-
外部シンボルの未解決のエラー
-
LNK2019: 未解決の外部シンボル...
-
LNK2019: 外部シンボル どのよ...
-
IP Helper APIを使うとエラーが...
-
gdiplusのリンクエラー
-
LNK2001(Pro*c)
-
C++STLについての質問です。
-
C++ Builderでユニットの追加
-
エラーの内容教えてください
-
C言語のエラー LNK1120: 外部参照
-
VC++/MFCで error LNK2001
-
エラー 未解決の外部シンボル
-
実行ファイルの容量を減らした...
-
Windowsアプリケーションをどう...
-
クラスを使ったC++の関数を...
-
質問させてください。
-
コンパイルエラー
-
リンカのエラー
おすすめ情報