vba 実行時エラー 48 ファイルが見つかりません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
yamada

vba 実行時エラー 48 ファイルが見つかりません

#1

投稿記事 by yamada » 9年前

はじめまして、プログラム初心者です。

VC6 で作成dllファイルを、64Bit環境で使えるように
VC2010でdllファイルを再作成しました。

こちらのdllファイルを エクセルvbaよりコールすると

「実行時エラー 48 ファイルが見つかりません」のメッセージ表示されます。

ネットで色々調べているのですが

原因がわからない状態です。

どこから調べればよいのか、ご指導いただけないでしょうか。

よろしくお願いします。

can110
記事: 27
登録日時: 10年前

Re: vba 実行時エラー 48 ファイルが見つかりません

#2

投稿記事 by can110 » 9年前

件のDLLは、プロジェクト設定を特に変更しない限り32bit版として作成されます。
一方、64bitOS上では、デフォルトでは64bit版のVBSが実行され、64bit動作上では32bit版DLLは利用できません。
32bit版のVBS実行EXE(C:\Windows\SysWOW64\WScript.exe)を明示的に指定して起動することで、動作するかと思います。

詳細は以下を参照ください。
VBS(VBScript/Visual Basic Script)を使用する方法
(32/64bit)

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: vba 実行時エラー 48 ファイルが見つかりません

#3

投稿記事 by YuO » 9年前

yamada さんが書きました:こちらのdllファイルを エクセルvbaよりコールすると
「実行時エラー 48 ファイルが見つかりません」のメッセージ表示されます。
これは,該当するDLLファイルが見つからないだけでなく,
そのDLLファイルが依存するDLLファイルが見つからない場合にも発生します。
例えば対象環境に該当するSPの当たったVC++2010 再頒布可能パッケージがインストールされていないなどが該当します。

実行環境にDependency Walkerを入れて,DLLの依存関係にエラーがないか調べてみるのがよいかと思います。

yamada

Re: vba 実行時エラー 48 ファイルが見つかりません

#4

投稿記事 by yamada » 9年前

実行環境にDependency Walkerを入れて,DLLの依存関係にエラーがないか調べてみるのがよいかと思います。[/quote]

お世話になります。

Download Version 2.2.6000 for x64 [468k]ダウンロードしまして

dllファイルを開き画面右上の PI 部に赤色表示のものは無い様子です。

何か良い方法がありましたら教えてください。

yamada

Re: vba 実行時エラー 48 ファイルが見つかりません

#5

投稿記事 by yamada » 9年前

[quote="can110" id=3,17768,137077]件のDLLは、プロジェクト設定を特に変更しない限り32bit版として作成されます。
一方、64bitOS上では、デフォルトでは64bit版のVBSが実行され、64bit動作上では32bit版DLLは利用できません。
32bit版のVBS実行EXE(C:\Windows\SysWOW64\WScript.exe)を明示的に指定して起動することで、動作するかと思います。

お世話になります。

明示的に指定する方法を教えていただけないでしょうか。

宜しくお願いします。

yamada

Re: vba 実行時エラー 48 ファイルが見つかりません

#6

投稿記事 by yamada » 9年前

Download Version 2.2.6000 for x86 (Windows 95 / 98 / Me / NT / 2000 / XP / 2003 / Vista / 7 / 8) [610k]
をダウンロードしたところ
Kernel32.dll が問題のようです。
64Bit環境でKernel32.dll の使用方法についてもネットで調べている最中ですが
難しい様子です。
何かよい方法はないでしょうか。

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: vba 実行時エラー 48 ファイルが見つかりません

#7

投稿記事 by YuO » 9年前

根本的な話ですが,
  • 利用している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もホスト可能です。

can110
記事: 27
登録日時: 10年前

Re: vba 実行時エラー 48 ファイルが見つかりません

#8

投稿記事 by can110 » 9年前

Yuoさんのおっしゃる通り、今回のケースはExcel(VBA)のため、的外れな回答でした。
失礼しました。

64bit版のDLLを作成するには、以下に説明あるように、プロジェクトの構成にてプラットフォームを追加する必要があります。
方法 : Visual C++ プロジェクトを 64 ビット プラットフォーム用に設定する

VC6のプロジェクトをVS2010にコンバートしただけでは追加されませんので、意識的に上記の作業を行っていないのであれば
DLLは32bit版ではないかと思います。

yamada

Re: vba 実行時エラー 48 ファイルが見つかりません

#9

投稿記事 by yamada » 9年前

[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

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: vba 実行時エラー 48 ファイルが見つかりません

#10

投稿記事 by YuO » 9年前

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);
のような感じで。
# テスト的に書いているので,動くかどうかはわかりません。

yamada

Re: vba 実行時エラー 48 ファイルが見つかりません

#11

投稿記事 by yamada » 9年前

おせわになります。

dllファイルに引数を渡すのですが

どのような記述をすればよいのでしょうか

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: vba 実行時エラー 48 ファイルが見つかりません

#12

投稿記事 by YuO » 9年前

yamada さんが書きました:dllファイルに引数を渡すのですが
どのような記述をすればよいのでしょうか
DLLファイルはロードすることしかできません。
このため,DLLファイルに引数を渡す,ということが根本的に出来ないのですが,何をしようとしているのでしょうか。

DLLに含まれる関数に引数を渡す,というのであれば,先に書いたコード片を参考にすればよいと思いますが。

yamada

Re: vba 実行時エラー 48 ファイルが見つかりません

#13

投稿記事 by yamada » 9年前

お世話になります。

前回まではDLLファイルをエクセルVBAからしか起動できなかったのですが、

VB2010からDLLをコールできるプログラムがありましたので、こちらでテストしていたのですが、

今度は、DLL 'test' の 'test@8' というエントリポイントが見つかりません。と出ます。


test.cppは VC6で作ったものを vc2010で新規プロジェクトを作成して既存のtest.cppを追加してデバックしていまして。(やりかたが悪いかもです。)

defファイルなどを試してみても同じ結果です。(やりかたが悪いかもです。)

なにか良い方法はないでしょうか?

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: vba 実行時エラー 48 ファイルが見つかりません

#14

投稿記事 by YuO » 9年前

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している名前を指定する必用があります。

yamada

Re: vba 実行時エラー 48 ファイルが見つかりません

#15

投稿記事 by yamada » 9年前

YuOさん ありがとうございます。

うまくいきました。

閉鎖

“C言語何でも質問掲示板” へ戻る