vba 実行時エラー 48 ファイルが見つかりません
vba 実行時エラー 48 ファイルが見つかりません
はじめまして、プログラム初心者です。
VC6 で作成dllファイルを、64Bit環境で使えるように
VC2010でdllファイルを再作成しました。
こちらのdllファイルを エクセルvbaよりコールすると
「実行時エラー 48 ファイルが見つかりません」のメッセージ表示されます。
ネットで色々調べているのですが
原因がわからない状態です。
どこから調べればよいのか、ご指導いただけないでしょうか。
よろしくお願いします。
VC6 で作成dllファイルを、64Bit環境で使えるように
VC2010でdllファイルを再作成しました。
こちらのdllファイルを エクセルvbaよりコールすると
「実行時エラー 48 ファイルが見つかりません」のメッセージ表示されます。
ネットで色々調べているのですが
原因がわからない状態です。
どこから調べればよいのか、ご指導いただけないでしょうか。
よろしくお願いします。
Re: vba 実行時エラー 48 ファイルが見つかりません
件のDLLは、プロジェクト設定を特に変更しない限り32bit版として作成されます。
一方、64bitOS上では、デフォルトでは64bit版のVBSが実行され、64bit動作上では32bit版DLLは利用できません。
32bit版のVBS実行EXE(C:\Windows\SysWOW64\WScript.exe)を明示的に指定して起動することで、動作するかと思います。
詳細は以下を参照ください。
VBS(VBScript/Visual Basic Script)を使用する方法
(32/64bit)
一方、64bitOS上では、デフォルトでは64bit版のVBSが実行され、64bit動作上では32bit版DLLは利用できません。
32bit版のVBS実行EXE(C:\Windows\SysWOW64\WScript.exe)を明示的に指定して起動することで、動作するかと思います。
詳細は以下を参照ください。
VBS(VBScript/Visual Basic Script)を使用する方法
(32/64bit)
Re: vba 実行時エラー 48 ファイルが見つかりません
これは,該当するDLLファイルが見つからないだけでなく,yamada さんが書きました:こちらのdllファイルを エクセルvbaよりコールすると
「実行時エラー 48 ファイルが見つかりません」のメッセージ表示されます。
そのDLLファイルが依存するDLLファイルが見つからない場合にも発生します。
例えば対象環境に該当するSPの当たったVC++2010 再頒布可能パッケージがインストールされていないなどが該当します。
実行環境にDependency Walkerを入れて,DLLの依存関係にエラーがないか調べてみるのがよいかと思います。
Re: vba 実行時エラー 48 ファイルが見つかりません
実行環境にDependency Walkerを入れて,DLLの依存関係にエラーがないか調べてみるのがよいかと思います。[/quote]
お世話になります。
Download Version 2.2.6000 for x64 [468k]ダウンロードしまして
dllファイルを開き画面右上の PI 部に赤色表示のものは無い様子です。
何か良い方法がありましたら教えてください。
お世話になります。
Download Version 2.2.6000 for x64 [468k]ダウンロードしまして
dllファイルを開き画面右上の PI 部に赤色表示のものは無い様子です。
何か良い方法がありましたら教えてください。
Re: vba 実行時エラー 48 ファイルが見つかりません
[quote="can110" id=3,17768,137077]件のDLLは、プロジェクト設定を特に変更しない限り32bit版として作成されます。
一方、64bitOS上では、デフォルトでは64bit版のVBSが実行され、64bit動作上では32bit版DLLは利用できません。
32bit版のVBS実行EXE(C:\Windows\SysWOW64\WScript.exe)を明示的に指定して起動することで、動作するかと思います。
お世話になります。
明示的に指定する方法を教えていただけないでしょうか。
宜しくお願いします。
一方、64bitOS上では、デフォルトでは64bit版のVBSが実行され、64bit動作上では32bit版DLLは利用できません。
32bit版のVBS実行EXE(C:\Windows\SysWOW64\WScript.exe)を明示的に指定して起動することで、動作するかと思います。
お世話になります。
明示的に指定する方法を教えていただけないでしょうか。
宜しくお願いします。
Re: vba 実行時エラー 48 ファイルが見つかりません
Download Version 2.2.6000 for x86 (Windows 95 / 98 / Me / NT / 2000 / XP / 2003 / Vista / 7 / 8) [610k]
をダウンロードしたところ
Kernel32.dll が問題のようです。
64Bit環境でKernel32.dll の使用方法についてもネットで調べている最中ですが
難しい様子です。
何かよい方法はないでしょうか。
をダウンロードしたところ
Kernel32.dll が問題のようです。
64Bit環境でKernel32.dll の使用方法についてもネットで調べている最中ですが
難しい様子です。
何かよい方法はないでしょうか。
Re: vba 実行時エラー 48 ファイルが見つかりません
根本的な話ですが,
一つのプロセスには,どちらかのアーキテクチャのモジュールしか入れることができません。
このため,OSが64bitであっても,Excelが32bitであるならば,32bitのDLLを使用する必用があります。
- 利用しているExcelは32bit版・64bit版のどちらなのか (ref 使用している Office のバージョンを確認する方法)
→おそらく,64bit版を指定しない限り32bit版がインストールされるはずです。 - 作成したDLLは32bit版・64bit版のどちらなのか
→Dependency Walkerの挙動を見る限り,64bit版のDLLを作成しているようですが。
一つのプロセスには,どちらかのアーキテクチャのモジュールしか入れることができません。
このため,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もホスト可能です。
なお,実行エンジンであるcscript/wscriptはVBSのみならず,JScriptもホスト可能です。
Re: vba 実行時エラー 48 ファイルが見つかりません
Yuoさんのおっしゃる通り、今回のケースはExcel(VBA)のため、的外れな回答でした。
失礼しました。
64bit版のDLLを作成するには、以下に説明あるように、プロジェクトの構成にてプラットフォームを追加する必要があります。
方法 : Visual C++ プロジェクトを 64 ビット プラットフォーム用に設定する
VC6のプロジェクトをVS2010にコンバートしただけでは追加されませんので、意識的に上記の作業を行っていないのであれば
DLLは32bit版ではないかと思います。
失礼しました。
64bit版のDLLを作成するには、以下に説明あるように、プロジェクトの構成にてプラットフォームを追加する必要があります。
方法 : Visual C++ プロジェクトを 64 ビット プラットフォーム用に設定する
VC6のプロジェクトをVS2010にコンバートしただけでは追加されませんので、意識的に上記の作業を行っていないのであれば
DLLは32bit版ではないかと思います。
Re: vba 実行時エラー 48 ファイルが見つかりません
[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
返答 本当にありがとうございます。
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 ファイルが見つかりません
x64でC/C++のコードを書いてしまうのが一番簡単だと思います。yamada さんが書きました:64BitのPCで64BItのdllファイルの動作確認する方法はあるでしょうか?( エクセルVBA以外でになります )
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 ファイルが見つかりません
DLLファイルはロードすることしかできません。yamada さんが書きました:dllファイルに引数を渡すのですが
どのような記述をすればよいのでしょうか
このため,DLLファイルに引数を渡す,ということが根本的に出来ないのですが,何をしようとしているのでしょうか。
DLLに含まれる関数に引数を渡す,というのであれば,先に書いたコード片を参考にすればよいと思いますが。
Re: vba 実行時エラー 48 ファイルが見つかりません
お世話になります。
前回まではDLLファイルをエクセルVBAからしか起動できなかったのですが、
VB2010からDLLをコールできるプログラムがありましたので、こちらでテストしていたのですが、
今度は、DLL 'test' の 'test@8' というエントリポイントが見つかりません。と出ます。
test.cppは VC6で作ったものを vc2010で新規プロジェクトを作成して既存のtest.cppを追加してデバックしていまして。(やりかたが悪いかもです。)
defファイルなどを試してみても同じ結果です。(やりかたが悪いかもです。)
なにか良い方法はないでしょうか?
前回まではDLLファイルをエクセルVBAからしか起動できなかったのですが、
VB2010からDLLをコールできるプログラムがありましたので、こちらでテストしていたのですが、
今度は、DLL 'test' の 'test@8' というエントリポイントが見つかりません。と出ます。
test.cppは VC6で作ったものを vc2010で新規プロジェクトを作成して既存のtest.cppを追加してデバックしていまして。(やりかたが悪いかもです。)
defファイルなどを試してみても同じ結果です。(やりかたが悪いかもです。)
なにか良い方法はないでしょうか?
Re: vba 実行時エラー 48 ファイルが見つかりません
本当に,exportしている名前は"test@8"ですか。yamada さんが書きました:今度は、DLL 'test' の 'test@8' というエントリポイントが見つかりません。と出ます。
"_test@8"ではないでしょうか。
通常,このような名前をexportすると使いにくいので,DEFファイルを使って"test"をexportするようにします。
Dependency WalkerでDLLを開けば,DLLがexportしている名前がわかります。
DllImport属性のEntryPointパラメータや,Declare文のAlias句で指定する名前は,DLLがexportしている名前を指定する必用があります。