• 締切済み

DeclearステートメントのLib節について

あるマシン(Windows2000)上で、Excel VBAからAPI経由で、System32内のあるDLL(AAA.dll)の関数(BBB)を実行したいと思います。ただし、現在のAAA.dllはバージョンが古くて正しく実行できないため、AAA.dllファイルを更新したいのですが、マシンにかなり厳しい制限がかかっており、AAA.dllファイルを更新することができません。 仕方が無いので、Excelファイルと同じディレクトリ(c:\temp)に新しいAAA.dllファイルを置いて、以下のように参照するようにしています。 Declear Function BBB Lib "c:\temp\AAA.dll" (... これで正しく実行できるのですが、これらのファイルを別の場所に移動させた場合、Lib節の参照パスも変更する必要があります。 Excelファイルを主に使うユーザにそういった変更をさせる訳にはいかないため、「ExcelファイルのカレントディレクトリのAAA.dllを参照しろ」といった指定をする方法はあるのでしょうか? レジストリの設定でDLLの参照順を変えられる技もあるみたいですが、上述したようにマシンの制限からレジストリも変更できません。 どなたか良い方法をご存知であれば是非ともご教授お願いします。

みんなの回答

  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.5

Declearでしたね。 文中と勘違いしていました。 それなら、使用するDLLの名前を変更したら良いのではないでしょうか? そういうのは無理なんですか?

secky_martha
質問者

お礼

引き続きのご回答感謝します。 > 使用するDLLの名前を変更したら良いのではないでしょうか? あ、それは気がつきませんでした。Excelファイルが置いてあるフォルダには全く制限がかかっていないので、新しいバージョンのDLLファイルの名前を変更して保存することはできると思います。 連休明けにKenKen_SPさんの方法と同様に試してみたいと思います。 ありがとうございます。

secky_martha
質問者

補足

ご回答いただけたお二人の方法を試してみたところ、以下の結果となりました: 1. Excelファイルと同じディレクトリに最新のAAA.dllを保存して実行  └→System32の古いAAA.dllを参照してしまう 2. Excelファイルと同じディレクトリに最新のAAA.dllをCCC.dllに名前を変更して保存し、...Lib "CCC.dll"...とDeclare文も変更して実行  └→"CCC.dllがみつかりません"とエラーが出てしまう。ただし、CCC.dllへのフルパスを指定してやると実行できる。 …どうもうまくいきませんでした。他に考えられる打開策はないのでしょうか。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.4

MSDN で「DLL 検索パス」と調べると次の順になってました。 1. アプリケーションがロードされたディレクトリ 2. カレントディレクトリ 3. Windowsシステムディレクトリ(system32) 4. Windowsディレクトリ 5. Path 環境変数に設定されたディレクトリ 資料によっては #3 の順で書かれてたりして混乱してます^^; が、MSDN が最も信頼できるソースだと思いますので、同一フォルダなら #2 で OK ではないかと。再訂正いたします。 しかし、#3 についての確認作業はしてませんので自信なしです。 お騒がせしました。

参考URL:
http://search.microsoft.com/results.aspx?mkt=ja-JP&setlang=ja-JP&q=+DLL+%E6%A4%9C%E7%B4%A2%E3%83%91%E3%82%B9
secky_martha
質問者

お礼

ご回答ありがとうございます。 MSDNの参考ページ拝見しました。この通りにDLLが検索されるとすれば、ANo.2の記述でOKということですね。質問で書いたマシンは会社にあるので、連休明けにtryしてみます。

secky_martha
質問者

補足

こんばんわ。 本日、会社のPCでANo.2のとおり試してみたのですが、Excelファイルと同じフォルダにあるDLLよりSystem32のほうを優先して参照してしまっているようです。 DLL名を変える方法はまだ試していませんので、これと合わせて明日もう一度tryしてみます。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

あ、、勘違いです。古い DLL があるんでしたね。 DLL の検索順位は System32フォルダ→Systemフォルダ→Windowsフォルダ→カレントフォルダ なので、System32 に古いのがあったらダメですね...すみません。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。KenKen_SP です。 > Excelファイルと同じディレクトリ(c:\temp)に新しいAAA.dllファイルを > 置いて、以下のように参照するようにしています。 DLL が同一フォルダにあるなら、 Declear Function BBB Lib "c:\temp\AAA.dll" (...   ↓ Declear Function BBB Lib "AAA.dll" (... で良いと思います。DLL の検索範囲は、 ・同一フォルダ ・System32 などのパスの通ったフォルダ ですから。確認してみましたが、*.xls と同一フォルダ内に DLL があれば、 フォルダパスが変わっても問題ないです。

  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.1

開いたブックと同じ場所なら ActiveWorkbook.Path EXCELの実行ファイルと同じ場所なら Application.Path でどうでしょうか?

secky_martha
質問者

お礼

さっそくのご回答、ありがとうございます。 ご提案の通り以下のように修正してみたのですが、文法エラーとなってしまいます: Declare Function BBB Lib ActiveWorkBook.Path & "\AAA.DLL" ( ... ↑VBエディタでステートメント全体が赤くなってしまう。 念の為実行したところ、「文字列定数」というエラーメッセージが出てしまいます。このメッセージからすると、文字列定数以外ではダメということなのでしょうか…。

関連するQ&A

  • Visual studio c++ dll作成時のエラー

    c初心者です。 ユーザーからもらったaaa.dllにある関数Calc_UL(struct型)をコールするbbb.dllを作成しようしています。 コンパイルはとおるのですが、 dllのビルドがうまくいきません。ユーザーからはaaa.dllとaaa.libとaaa.hだけもらっており、aaa.libにはリンク設定をしています。 bbb.obj : error LNK2001: 外部シンボル ""int __stdcall Calc_UL(struct ULData *)" (?Calc_UL@@YGHPAUULData@@@Z)" は未解決です Debug/bbb.dll : fatal error LNK1120: 外部参照 1 が未解決です。 link.exe の実行エラー aaa.dllを指定するところが特に無いのですが、どこかで指定しないといけないのでしょうか? よろしくお願いします。

  • .objファイル、.lib ファイルについて

    ◆C++でのコンパイルされたプログラムの参照について。  以前、VB.netで開発をしていた時は、コンパイルをするとDLLが作成され、  それを他のプログラムからリンクして使用していました。  C++の場合h、cppのファイルをコンパイルすると、「.DLL」はできないのでしょうか? ◆.obj、.lib について  Visual Studioにて、.obj、.lib を、参照先に設定していますが、  内容をよくわかっていません。  オブジェクトリンク、ライブラリリンクとは、  (1)それぞれどんな概念なのでしょうか?  (2).obj、.libでは何が違うのでしょうか?

  • C++ リソースファイルの使い方について

    うまく説明できていないかもしれませんが AAA.exeとBBB.exeとBBB.exeを実行するために必要なファイル(以後 CCC.dll)があり、 AAA.exeの中にBBB.exeとCCC.dllを埋め込み AAAexeを実行時にCCC.dllをsystem32フォルダの中に置き、その後BBB.exeを実行させたいのですが、埋め込んだファイルの抽出方法が見つかりません。 どなたか、抽出ソースの書き方、またはよいサイトをご存じでしたら教えていただけないでしょうか?

  • CreateFile が ERROR_PATH_NOT_FOUND のエラーになる

    VC++を使っています。OSは Windows2000 です。 CreateFile で指定するファイル名をフルパスで指定し、EXEを同じ ディレクトリに置いて実行したところエラーとなり、詳細コードが ERROR_PATH_NOT_FOUND でした。 プログラムは以下のようになっています。 #define AAA "c:winnt\\system32\\AAA.log" hOpen = CreateFile( AAA, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 上記プログラムの AAA.exe を system32下に置いて実行すると、 パスが不正だと怒られてしまいます。。。 AAA.exe を別ディレクトリで実行すると、sysytem32下にちゃんと ファイルが作成されます。 AAA.exe を CreateProcess する BBB.exe を造って試しましたが、 やはり BBB.exe が system32下にあると駄目でした。 どうやらカレントディレクトリが同じだと駄目みたいです。 「"AAA.log"」とせずにフルパスとしているのは以下の理由のためです。 ・ファイルは必ず system32下に作成したい。 ・AAA.exe は必ず system32下にある。 しかし、BBB.exe が必ず system32下にあるとは限らないため、 「"AAA.log"」とした場合、BBB.exe を実行したディレクトリに 作成されてしまう。 CreateFile には今回のような制限があるのでしょうか??? #ヘルプを見る限り、書いてないです。。。

  • PHPセーフモードをディレクトリ毎に設定するには?

    OSはLinux Fedora10で、ウェブサーバは Apache/2.2.10 (Unix)、PHPは5.2.9 (cli)を使用しています。 以下のディレクトリをウェブサーバのディレクトリとして作成し、その中にPHPファイルをそれぞれ設置しています。 /var/www/aaa /var/www/bbb /var/www/ccc ここで、ディレクトリ「/var/www/aaa」内のPHPファイルにおいては、system()やその他のプログラム実行関数を許可したいのですが、その他の「/var/www/bbb」や「/var/www/ccc」内のPHPファイルにおいては許可したくありません。 上記のことを実現すべく、プログラム実行関数の使用を制限するために、「php.ini」のファイルを以下のように変更しました。(その後、HTTPDを再起動して、変更を反響させました。) safe_mode = Off  ↓ safe_mode = On safe_mode_exec_dir =  ↓ safe_mode_exec_dir = /var/www/aaa  すると、ディレクトリ「/var/www/bbb」や「/var/www/ccc」内のPHPファイルだけではなく、除外したはずの「/var/www/aaa」内のPHPファイルでも、system()やその他のプログラム実行関数の使用ができなくなりました。そして、以下のようなエラーメッセージを受け取ります。 Warning: shell_exec() [function.shell-exec]: Cannot execute using backquotes in Safe Mode in /var/www/aaa/example.php on line 10  PHPのセーフモードをディレクトリ毎にうまく設定するにはどうすればよいのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • PHP
  • ファイルが突然消えた?

    c:\tempというディレクトリに様々なファイルを入れていたのですが,ある時突然ほとんどのファイルが消えていたのです. 残っていたのは前回起動時に使用中のファイルのみ. 前にも同じディレクトリで同じ現象がありました. テンポラリフォルダとして扱われているためにある時全て削除されたりするのでしょうか? だとすればautoexec.batに set TEMP=c:\windows\temp とか書き込めばいいのでしょうか? それともウィルス?ハッキング? 何か怪しいソフトがあるとか? # 多分最初の選択肢が一番可能性が高いと思うのですが, # それをすると必要な一時ファイルも消えてしまうのではと危惧しています # レジストリにはInternet Explorerのダウンロードディレクトリに指定されていただけです # それも,レジストリ再構築で消えたので恐らくは単なる履歴でしょう 使用しているのはWin98 SE,マシンはVAIOです.

  • ファイルから検索条件を読み込んでGREPを実行したい

    INPUTファイルを以下のように作成します。 >input.txt aaa bbb ccc ・ ・ ・ 特定のディレクトリの複数ファイルに対して grepを順にaaa,bbb,ccc・・・ というようにinput.txtから読み込んで実行し、結果をそれぞれaaa.txt,bbb.txt,ccc.txt・・・ へ出力したいのですが、方法がわからなくて困っています。 どなたかご教授お願いいたします。

    • ベストアンサー
    • Perl
  • ディレクトリの中身(ファイル)をコピーするコマンドは?(fedora)

    こんにちは。 fedora core5を使っていてCPコマンドで困りました。 cp -R /home/aaa /home/bbb と入力して、aaaというディレクトリの中身のファイルを全てbbbというディレクトリへコピーしようとしたのですが、これではaaaというディレクトリごとbbbへコピーされてしまい、/home/bbb/aaa みたいになってしまいます。 指定したディレクトリの中のファイルを全て別ディレクトリへコピーするときはどのように指定すればよいのでしょうか?

  • 現在、以下のような処理のマクロ[EXCEL2000]を作成しております

    現在、以下のような処理のマクロ[EXCEL2000]を作成しておりますが、 今月から初めて携わる分野なので四苦八苦しております。 お力添えをお願いいたします。 なお、下記に出てくるディレクトリに関しては、今後変更も考えられますので コンフィグファイルを別途用意して指定するように作成します。 以下、処理の流れです。 (1)Aと言うディレクトリに以下のようなCSVファイルが格納されています。 ※例  20100201_AAA.csv  20100201_bbb.csv  20100201_ccc.csv  20100202_AAA.csv  20100202_bbb.csv (2)日付選択画面にて指定の日付を選択し、作成ボタンを押下します。  ※添付ファイルの画像参照 (3)指定された日付からAに格納されているCSVファイルを選択し、  対象ファイルのデータを新規EXCELファイルにコピーします。  ※例   2010年2月1日を選択した場合、以下のファイルが対象となります。   20100201_AAA.csv   20100201_bbb.csv   20100201_ccc.csv (4)新規EXCELファイルをCSVファイルと同名でBのフォルダへ保存します。  ※例   20100201_AAA.xls   20100201_bbb.xls   20100201_ccc.xls (5)終了 このような流れになっていますが、日付指定の画面作成から すでに躓いております。 お手数ですが、ご教授いただけますと助かります。 また今後の勉強のために、お勧めのサイトなどございましたら 教えていただけると幸いです。 それではよろしくお願いいたします。

  • データだけをコピーする方法

    定期的にサブディレクトリ内のファイルだけを、別のフォルダにコピーしたいと思います。 例えばコピー元ディレクトリaaaには、次のように階層化されていると仮定します。 aaa--aaa1--aaa11 aaa2--aaa21 aaa3--aaa31 --aaa32 このaaa配下に存在するすべてのファイルだけを 別のディレクトリbbbにコピーしたいのですが、bbbの中にはサブディレクトリは存在しない状態でファイルだけにしたいのです。 DOSのxcopyコマンド辺りを使うのだろうかと思ったのですが、このような方法の場合のオプションが分かりません。 何か良い方法はありますでしょうか? バッチを作ってコピー