LabViewでVC++2008で作るDLLを使用したい

[戻る]
knoda [E-Mail] 2009/10/26(月) 16:13:17
VC++2008Expressにて、簡単な演算用DLLを作り、他の言語(今回はLabView861)で作るプ
ログラムから使用したいのです。色々とネットも見て、明示的にやってみたつもりです
が、DLLは見えるものの以下の2つが解決できません。
@ DLL内部のエクスポートされている関数名が、本来"Swap"に対し"_aSwap@2"のように
名前装飾の問題がおきているようです。(LabView内にてDLL関数を呼び出す際に、画面上
に出てくる関数名を見る限り化けている。)
これはDEFファイルを使っても、__declspecキーワードを使っても同じでした。
A MSVCR90,MSVCR90D.dllファイルへの依存性。
まったくシンプルなANSI C準拠で書いていますが、DLLにしてなおかつこれらCRTへの依
存をなくすことはできないのでしょうか。アプリケーションをスタティックでリンクする
分にはやり方を見つけられたのですが、DLLは無理でしょうか。
なお、VC++のはいっていないPCにvcredist_x86.exe(VC2008SP1)をインストールしたので
すが、この問題は解決しません。どうしてでしょうか。

FlatWest 2009/10/26(月) 16:26:28
1. extern "C"  
2. /MT or /MTd 

knoda [E-Mail] 2009/10/26(月) 18:17:38
返信ありがとうございます。
関数頭へのextern "C"指定、プロジェクトプロパティ>構成プロパティ>C/C++>コード
生成>ランタイムライブラリで/MTまたは/Mtd試してみました。
どれも残念ながらだめでした。

まずは、Aにおけるvcredist_x86.exeによるインストールが効かないのはなぜでしょう
か?
どなたかヒントをお願いします。

PATIO 2009/10/27(火) 10:36:57
どーも、PATIOです。

とりあえず、丸付き数字は止めてください。
表示する人の環境によっては文字化けの原因になります。
詳しくは機種依存文字でしらべて見てください。

(1) VC++を使うとC++の規則で関数名がエクスポートされます。
この為、単純に関数名で狙い撃ちがしにくくなります。
エクスポートする関数全体をextern "C"{}で囲んでしまうと
エクスポート名がC言語の規則になるのでそれなら何とかなるのでは
ないかと言う話になると思います。
それでも駄目だとちょっと検討がつきません。
LabView861は使った事が無いのでどういう物なのかも分かりませんし。

(2) まず、デバッグ版のランタイムは基本的に再配布は出来ないはずなので
MSVCR90D.dllは配れません。つまり、開発環境を持っている人で無いと
デバッグ版のDLLは使えないと言う事になると思います。
デバッグ版で無いのであれば、通常はvcredist_x86.exeをインストールする事で
問題は解決するはずです。ただし、VisualStudio2005以降はDLLのバージョンが
完全に一致していないと文句を言われるようになっているので注意が必要です。
VS2008とVS2008SP1ではバージョンが違っていたと思いますので
開発環境にあっているのかを確認した方が良いと思います。

PATIO 2009/10/27(火) 10:40:17
追伸:
/MTと/MTdですが、マルチスレッド用のライブラリを使用する為のオプションみたい
なので、今回の件にはあまり関係無いような気がします。
この辺のコンパイルオプションに関しては一応意味を調べて理解した上で使用する
ようにした方が良いと思います。

PATIO 2009/10/27(火) 10:46:26
追伸の追伸:
前言撤回。/MTでマルチスレッド用のスタティックリンクライブラリを使うみたいですね。
これでなぜ駄目だったのかまでは分かりませんけれど。

仲澤@失業者 2009/10/27(火) 18:55:19
まず、(1)ですが、
1.DLLの関数 foo() の修飾が
  extern "C" __declspec(dllexport) void __stdcall foo(){} 
 の様にになっていること
2.*.def ファイルを作成していて、かつ
  LIBRARY   MyDLL
     EXPORTS
        foo     @1
 の様にになっていれば、VB等の他の言語から使用できるはずです。
LabViewについては詳しくないのでコメントできません。

次に(2)ですが、/MD(/MDd)でなく/MT(/MTd)、/LD(/LDd)を使用すれば
MFCのランタイムに依存しないはずです。

って言うか、Express(MFCとATL使用不能)使ってますよね(確認)。

EXE側にも同じオプションを使用しているはずなので、
両者ともLIBCMT.lib(LIBCMTD.lib)とスタティックにリンクされ、
MFCのランタイムには全く依存しないEXEとDLLが作成できる
はずなのですが。

仲澤@失業者 2009/10/27(火) 19:07:16
補足
C/C++言語のEXEの場合
__stdcallじゃなくて、__cdeclでインターフェース
する場合が多いですね。

aetos 2009/11/05(木) 12:21:05
関数名については、"Swap" が "_aSwap@2" になったというのが気になりますね。
"_Swap@2" にはなっても、"a" なんてつかないと思うんですが。
Dumpbin で見ても "_aSwap@2" になってますか?
スタートメニューから

Microsoft Visual Studio 2008
 Visual Studio Tools
  Visual Studio 2008 コマンド プロンプト

を立ち上げて、
 dumpbin /exports <DLL のフルパス>
をやっても、"_aSwap@2" になってますか?

古いスレッドには追加発言できません。