C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: VS2013で作成したC++のDLLが動作しないPCがある


(過去ログ 145 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■84849 / inTopicNo.1)  VS2013で作成したC++のDLLが動作しないPCがある
  
□投稿者/ マンゴー二世 (1回)-(2017/08/09(Wed) 13:49:53)

分類:[C/C++] 

現在、VB2013で開発したWindowsフォームアプリから、
VS2008で作成したC++のDLLをDllImportで呼び出して使用しています。

今回、このC++のDLLを修正し、この時、C++のDLLのビルド時にVS2013を使用したのですが、
VBアプリからこのDLLを呼び出しする際に例外が発生するPCがありました。

例外の内容は以下の通りです。(DLLを仮に「xxx.dll」とします)
System.DllNotFoundException: DLL 'xxx' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E)

なお、VBアプリはx86ビルドで、C++のDLLはWin32でビルドしています。
また、例外発生するPCは、確認している限りでは、
Windows7で32ビットのものも64ビットのものもありました。
逆に、問題なく動作するPCも、Windows7で32ビットのものも64ビットのものもありました。

とりあえず、修正したC++のDLLをVS2008でビルドしたものを使用したら
問題は解消されましたが、考えられる原因は何でしょうか?

よろしくお願いいたします。
引用返信 編集キー/
■84851 / inTopicNo.2)  Re[1]: VS2013で作成したC++のDLLが動作しないPCがある
□投稿者/ 魔界の仮面弁士 (1381回)-(2017/08/09(Wed) 14:12:50)
No84849 (マンゴー二世 さん) に返信
> とりあえず、修正したC++のDLLをVS2008でビルドしたものを使用したら
> 問題は解消されましたが、考えられる原因は何でしょうか?
DLL そのものではなく、「DLL の依存ファイル」が不足しているのでは無いでしょうか。

https://www.microsoft.com/ja-jp/download/details.aspx?id=5582
https://www.microsoft.com/ja-jp/download/details.aspx?id=40784
引用返信 編集キー/
■84852 / inTopicNo.3)  Re[1]: VS2013で作成したC++のDLLが動作しないPCがある
□投稿者/ とっちゃん (449回)-(2017/08/09(Wed) 14:14:09)
No84849 (マンゴー二世 さん) に返信
> 例外の内容は以下の通りです。(DLLを仮に「xxx.dll」とします)
> System.DllNotFoundException: DLL 'xxx' を読み込めません: 指定されたモジュールが見つかりません。 (HRESULT からの例外: 0x8007007E)
>
DllNotFoundException は、2種類のエラーが考えられます。

1.使おうとしたDLLが呼び出し元から見えない(配置場所の問題)
2.使おうとしたDLLが利用するDLLがシステムにインストールされていない(ランタイムの不足など)

があります。

> とりあえず、修正したC++のDLLをVS2008でビルドしたものを使用したら
> 問題は解消されましたが、考えられる原因は何でしょうか?
>
今までVS2008 でビルドしていたものをVS2013 にしたら動かなくなったということなので
おそらく後者のDLL不足だと思います。

エラーの出るマシンに、VC++2013 ランタイムはインストールされていますか?
また、インストールされている場合、ビルド環境のランタイムバージョンと同じかそれより新しいバージョンが
インストールされていますか?

まずはそれを確認してみてください。
なお、VC++2013のランタイムは、VS2013のインストールされた環境の
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\redist\1041\vcredist_x86.exe"
にあります(上記パスは、64bitOSで開発している場合)。

エラーの出るマシンで上記のvcredist_x86.exe を実行すると開発環境にあるランタイムと同等の VC++ランタイムがインストールされます。

引用返信 編集キー/
■84853 / inTopicNo.4)  Re[1]: VS2013で作成したC++のDLLが動作しないPCがある
□投稿者/ 774RR (557回)-(2017/08/09(Wed) 14:18:01)
Visual C++ でビルドした EXE/DLL はそれ単体では動作しない仕様っす。
対象マシンに Visual C++ Runtime Redistributables をインストールする必要があります。

Visual C++ 2008 で作った EXE/DLL は Visual C++ Runtime Redistributable 2008 が必要
Visual C++ 2013 で作った EXE/DLL は Visual C++ Runtime Redistributable 2013 が必要
Visual C++ 2015 で作った EXE/DLL は Visual C++ Runtime Redistributable 2015 が必要
(x64/x86 でそれぞれ別なものが必要)
https://www.microsoft.com/ja-jp/download/details.aspx?id=40784

どの Windows が標準状態でどの Runtime Redistributables が添付されているのかは要調査。
http://www.losttechnology.jp/Win7/install.vc.html

というわけであなたが作った EXE/DLL を末端ユーザーに配布する際にはきっちりインストーラを作って
適切な Runtime を追加インストールする必要があるっす。
デバッグ目的で同僚のマシンにインストールするのであれば Runtime Redistributables を単体インストールでOK

コントロールパネル→プログラムと機能と開くと Redistributables バージョン違いがいっぱい入っているはず。
たまたま必要なものが入っていないだけかと。

引用返信 編集キー/
■84855 / inTopicNo.5)  Re[2]: VS2013で作成したC++のDLLが動作しないPCがある
□投稿者/ マンゴー二世 (2回)-(2017/08/09(Wed) 15:58:13)
皆様、回答ありがとうございました。
Visual C++でビルドしたEXE/DLLは、ランタイムがないと動作しないのですね。

C++は専門外だったので、「何を今更」という感じで申し訳ないです。

それでは、VS2013でビルドしたDLLが動作したのも、
たまたま2013のラインタイムが入っていた、というこのなのですね。
また、VS2008ビルドのDLLも、そもそも2008のラインタイムがなければ
動作しない、ってことなのですね。

でも、VS2008ビルドのDLLに関しては、今回のようなエラーは見たことがありませんでした。
2008のラインタイムって、他ソフトでも結構使われていて、
すでにインストール済みのPCが多かった、ということなのでしょうか?
引用返信 編集キー/
■84856 / inTopicNo.6)  Re[3]: VS2013で作成したC++のDLLが動作しないPCがある
□投稿者/ 774RR (558回)-(2017/08/09(Wed) 16:27:08)
たまたまインストール済みのPCが多かったってことでしょね。
社内で共通に使っている****ソフトが VS2008 ベースであったとか、そんな理由。

# VS2005/VS2008 は SxS 構成だから Windows Update のセキュリティアップデートの際に新しいバージョンが
# 自動配信されるような気がする。だから入っている確率が高いとか? そこへんは未調査です。

引用返信 編集キー/
■84858 / inTopicNo.7)  Re[4]: VS2013で作成したC++のDLLが動作しないPCがある
□投稿者/ マンゴー二世 (3回)-(2017/08/09(Wed) 17:10:15)
> たまたまインストール済みのPCが多かったってことでしょね。
> 社内で共通に使っている****ソフトが VS2008 ベースであったとか、そんな理由。

774RR様、コメントありがとうございました。
なるほど、やはりそういうことですか。

とりあえず、このスレッドは解決ということでクローズします。
皆様、ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -