かなり基本的な質問で申し訳ありませんがよろしくお願いします。
フォームアプリケーションでプロジェクトを作成し、
そこからCで作られた関数を呼び出そうとすると
error LNK2028が発生してしまいます。
フォームアプリは/clrで作成してあり、(__clrcall)
Cの関数は/clrを使用せず__cdecl呼び出し規則になっています。
ということでLNK2028が出てると思うのですが
このエラーを解決する方法ってありますか?
よろしくお願いします。
すいません、環境がもれていました。
Visual Studio 2005 VC++を使用しています。
>フォームアプリは/clrで作成
/clr:pure→/clr
と変更されたわけですよね?
>かなり基本的な質問
ではないかなぁと。
C++/CLIに関しては情報が少ないですから。
>/clr:pure→/clr
>と変更されたわけですよね?
そうです。
どうにか回避できないものでしょうか…
もしできないのであれば、DllImportを使うしかないですかね。
(CallingConvention=CallingConvention.Cdeclを指定)
この場合文字列を扱うときすこし工夫する必要がありますけど。
すいません、
>もしできないのであれば、DllImportを使うしかないですかね。
>(CallingConvention=CallingConvention.Cdeclを指定)
検索してみたのですが、使い方が理解できませんでした。
どのように使用すればいいのでしょうか?
/clrなら__cdeclの関数を普通に使えるはずです。
手元のVC2005EEで試してみても特に問題なくビルドできますよ。
LNK2028は単に未解決のシンボル参照があるというエラーなので
リンク設定がされていないだけなのではないですか?
# ヘルプの先頭あたりにいきなり
# 「ネイティブ関数を純粋なイメージにインポートしようとするときは、
# ネイティブ コンパイルと純粋なコンパイルで
# 暗黙の呼び出し規約が異なることに注意してください。」
# って書かれてるのを鵜呑みにしていませんか?
なんのための/clrなのかとかをきちっと理解したほうが良いと思いますよ
肝心の関数の引数とかわかんないので適当になってしまいますけど。
[DllImport("XXXXX.dll", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.Cdecl)]
static int add(int x, int y);
こんなかんじ。
>/clrなら__cdeclの関数を普通に使えるはずです。
やっぱりそうですよね。
>鵜呑みにしていませんか?
鵜呑みにしてしまいました。orz
(まさか、〜.libをリンクしていない落ちだと思わなかったわけで。)
使えました。
勉強不足を痛感しました。ありがとうございます。
>使えました。
とは?
〜.libをリンクしたということ?
C++/CLIでもDllImportを使うのはかなりアブノーマルです。
〜.libファイルがないという理由で使うのはないかと。
(ないならLoadLibrary&GetProcAddressをつかう)
あれ
>C++/CLIでもDllImportを使うのはかなりアブノーマルです。
やっぱありかなぁ。。
LoadLibrary&GetProcAddressを使うよりも扱いやすいか。
>〜.libをリンクしたということ?
リンクしたところ動きました。
すいません、つまらない落ちでした