ページ 1 / 1
vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月05日(土) 15:30
by yamada
はじめまして、プログラム初心者です。
VC6 で作成dllファイルを、64Bit環境で使えるように
VC2010でdllファイルを再作成しました。
こちらのdllファイルを エクセルvbaよりコールすると
「実行時エラー 48 ファイルが見つかりません」のメッセージ表示されます。
ネットで色々調べているのですが
原因がわからない状態です。
どこから調べればよいのか、ご指導いただけないでしょうか。
よろしくお願いします。
Re: vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月07日(月) 09:30
by can110
件のDLLは、プロジェクト設定を特に変更しない限り32bit版として作成されます。
一方、64bitOS上では、デフォルトでは64bit版のVBSが実行され、64bit動作上では32bit版DLLは利用できません。
32bit版のVBS実行EXE(C:\Windows\SysWOW64\WScript.exe)を明示的に指定して起動することで、動作するかと思います。
詳細は以下を参照ください。
VBS(VBScript/Visual Basic Script)を使用する方法
(32/64bit)
Re: vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月07日(月) 21:02
by YuO
yamada さんが書きました:こちらのdllファイルを エクセルvbaよりコールすると
「実行時エラー 48 ファイルが見つかりません」のメッセージ表示されます。
これは,該当するDLLファイルが見つからないだけでなく,
そのDLLファイルが依存するDLLファイルが見つからない場合にも発生します。
例えば対象環境に該当するSPの当たったVC++2010 再頒布可能パッケージがインストールされていないなどが該当します。
実行環境に
Dependency Walkerを入れて,DLLの依存関係にエラーがないか調べてみるのがよいかと思います。
Re: vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月08日(火) 20:56
by yamada
実行環境に
Dependency Walkerを入れて,DLLの依存関係にエラーがないか調べてみるのがよいかと思います。[/quote]
お世話になります。
Download Version 2.2.6000 for x64 [468k]ダウンロードしまして
dllファイルを開き画面右上の PI 部に赤色表示のものは無い様子です。
何か良い方法がありましたら教えてください。
Re: vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月08日(火) 20:58
by yamada
[quote="can110" id=3,17768,137077]件のDLLは、プロジェクト設定を特に変更しない限り32bit版として作成されます。
一方、64bitOS上では、デフォルトでは64bit版のVBSが実行され、64bit動作上では32bit版DLLは利用できません。
32bit版のVBS実行EXE(C:\Windows\SysWOW64\WScript.exe)を明示的に指定して起動することで、動作するかと思います。
お世話になります。
明示的に指定する方法を教えていただけないでしょうか。
宜しくお願いします。
Re: vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月08日(火) 21:40
by yamada
Download Version 2.2.6000 for x86 (Windows 95 / 98 / Me / NT / 2000 / XP / 2003 / Vista / 7 / 8) [610k]
をダウンロードしたところ
Kernel32.dll が問題のようです。
64Bit環境でKernel32.dll の使用方法についてもネットで調べている最中ですが
難しい様子です。
何かよい方法はないでしょうか。
Re: vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月08日(火) 23:34
by YuO
根本的な話ですが,
- 利用しているExcelは32bit版・64bit版のどちらなのか (ref 使用している Office のバージョンを確認する方法)
→おそらく,64bit版を指定しない限り32bit版がインストールされるはずです。
- 作成したDLLは32bit版・64bit版のどちらなのか
→Dependency Walkerの挙動を見る限り,64bit版のDLLを作成しているようですが。
の2点を確認して,アーキテクチャが一致しているでしょうか。
一つのプロセスには,どちらかのアーキテクチャのモジュールしか入れることができません。
このため,OSが64bitであっても,Excelが32bitであるならば,32bitのDLLを使用する必用があります。
オフトピック
can110さんは何故かVBS (VB Script) の話をしていますが,Excel VBA (Visual Basic for Applications) と VB Scriptは別物ですし,Windows Scripting Host (WSH) とExcelは無関係です。
なお,実行エンジンであるcscript/wscriptはVBSのみならず,JScriptもホスト可能です。
Re: vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月09日(水) 18:40
by can110
Yuoさんのおっしゃる通り、今回のケースはExcel(VBA)のため、的外れな回答でした。
失礼しました。
64bit版のDLLを作成するには、以下に説明あるように、プロジェクトの構成にてプラットフォームを追加する必要があります。
方法 : Visual C++ プロジェクトを 64 ビット プラットフォーム用に設定する
VC6のプロジェクトをVS2010にコンバートしただけでは追加されませんので、意識的に上記の作業を行っていないのであれば
DLLは32bit版ではないかと思います。
Re: vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月09日(水) 22:40
by yamada
[quote="can110" id=3,17768,137114]Yuoさんのおっしゃる通り、今回のケースはExcel(VBA)のため、的外れな回答でした。
返答 本当にありがとうございます。
64BitのPCで64BItのdllファイルを32BitのエクセルVBAより起動している状況だと思われまして、
「実行時エラー 48 ファイルが見つかりません」となっていました。
64BitのPCで64BItのdllファイルの動作確認する方法はあるでしょうか?( エクセルVBA以外でになります )
vbaより dllファイルのコールの記述は次のようになっています。
Declare PtrSafe Function test Lib "C:\test.dll" Alias "_test@8" (ByVal File As String, ByVal in As Integer) As Integer
Re: vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月10日(木) 14:23
by YuO
yamada さんが書きました:64BitのPCで64BItのdllファイルの動作確認する方法はあるでしょうか?( エクセルVBA以外でになります )
x64でC/C++のコードを書いてしまうのが一番簡単だと思います。
VBAを模倣するならば,LoadLibrary + GetProcAddressでtest関数を呼び出すようにすればよいでしょう。
コード:
auto hDll = LoadLibrary(TEXT("C:\\test.dll"));
assert(hDll != nullptr);
auto test = (short (__stdcall *)(LPCSTR, short))GetProcAddress(hDll, "_test@8");
assert(test != nullptr);
auto result = test("test", 120);
のような感じで。
# テスト的に書いているので,動くかどうかはわかりません。
Re: vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月11日(金) 11:00
by yamada
おせわになります。
dllファイルに引数を渡すのですが
どのような記述をすればよいのでしょうか
Re: vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月13日(日) 00:36
by YuO
yamada さんが書きました:dllファイルに引数を渡すのですが
どのような記述をすればよいのでしょうか
DLLファイルはロードすることしかできません。
このため,DLLファイルに引数を渡す,ということが根本的に出来ないのですが,何をしようとしているのでしょうか。
DLLに含まれる関数に引数を渡す,というのであれば,先に書いたコード片を参考にすればよいと思いますが。
Re: vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月15日(火) 01:32
by yamada
お世話になります。
前回まではDLLファイルをエクセルVBAからしか起動できなかったのですが、
VB2010からDLLをコールできるプログラムがありましたので、こちらでテストしていたのですが、
今度は、DLL 'test' の 'test@8' というエントリポイントが見つかりません。と出ます。
test.cppは VC6で作ったものを vc2010で新規プロジェクトを作成して既存のtest.cppを追加してデバックしていまして。(やりかたが悪いかもです。)
defファイルなどを試してみても同じ結果です。(やりかたが悪いかもです。)
なにか良い方法はないでしょうか?
Re: vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月15日(火) 12:35
by YuO
yamada さんが書きました:今度は、DLL 'test' の 'test@8' というエントリポイントが見つかりません。と出ます。
本当に,exportしている名前は"test@8"ですか。
"_test@8"ではないでしょうか。
通常,このような名前をexportすると使いにくいので,DEFファイルを使って"test"をexportするようにします。
Dependency WalkerでDLLを開けば,DLLがexportしている名前がわかります。
DllImport属性のEntryPointパラメータや,Declare文のAlias句で指定する名前は,DLLがexportしている名前を指定する必用があります。
Re: vba 実行時エラー 48 ファイルが見つかりません
Posted: 2016年3月17日(木) 20:11
by yamada
YuOさん ありがとうございます。
うまくいきました。