LabViewでVC++2008で作るDLLを使用したい – プログラミング – Home

通知
すべてクリア

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


knoda
 knoda
(@knoda)
ゲスト
結合: 15年前
投稿: 2
Topic starter  

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


引用解決済
トピックタグ
FlatWest
 FlatWest
(@FlatWest)
ゲスト
結合: 15年前
投稿: 17
 

1. extern C 
2. /MT or /MTd 


返信引用
knoda
 knoda
(@knoda)
ゲスト
結合: 15年前
投稿: 2
Topic starter  

返信ありがとうございます。
関数頭へのextern C指定、プロジェクトプロパティ>構成プロパティ>C/C++>コード
生成>ランタイムライブラリで/MTまたは/Mtd試してみました。
どれも残念ながらだめでした。

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

どーも、PATIOです。

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

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

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

まず、(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が作成できる
はずなのですが。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

補足
C/C++言語のEXEの場合
__stdcallじゃなくて、__cdeclでインターフェース
する場合が多いですね。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

関数名については、Swap が _aSwap@2 になったというのが気になりますね。
_Swap@2 にはなっても、a なんてつかないと思うんですが。
Dumpbin で見ても _aSwap@2 になってますか?
スタートメニューから

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました