• ベストアンサー

DLLのパス取得

WindowsXP+OFFICE2000環境です。 ファイルの構成は同じホルダの中に AA.xls、BB.DLL、CC.iniになっています。 AA.xEXCELシート上にボタンをつけて、ボタンを押すと、DLLを呼んでいます。 このDLLの中ではDllの位置のINIファイルを読んでいます。 Dllの中でfinder.FindFile("CC.ini"); を用いて呼んでいますが、INIファイルの検出ができません。なぜでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.5

DefaultFilePathって、規定のパスを変えるだけなので、 カレントは変更されていません。 なので、呼べません。 で、カレントを変えるのは、#3の方が書かれているChDirです。 で、DLLの検索順ですが、Windowsではここに書かれている順序で行われます。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpfileio/html/_win32_searchpath.asp なんで、一番安全で確実なのは、Pathを通すことです。

その他の回答 (4)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>エクセルシート(AA.xsl)を開くときに、エクセルの >『ツール/オプション/全般/カレントフォルダ名』を >エクセルシート(AA.xsl)のディレクトリ名にすることは >できないでしょうか。 出来ますけど、カレントディレクトリって、一度設定したらそのままってものじゃないですよ。 一番ありがちなのが、ファイル選択のコモンダイアログを開いたときなんかはカレントディレクトリは開いたところに移動します。 なんで、カレントを設定しなおすのはお勧めしません。 DLLと同じ場所にあるのでしたら、AfxGetInstanceHandleと GetModuleFileNameでDLLの場所を取得し、INIファイルはフルパスで指定することをお勧めします。

jaekuk
質問者

補足

ご回答有難うございます。 Private Sub Workbook_Open()  Application.DefaultFilePath = ActiveWorkbook.Path End Sub をエクセルシートに追加したらパスをエクセルシートを開くたびにエクセルシートの位置にすることが出来ましたが、新たな問題が出てきました。 エクセルシートの中でDLLを使うために 次の宣言が必要になります。 Private Declare Function FunA _ Lib "TEST_DLL01.dll" () As Integer これは現在のパスでTEST_DLL01.dllを探します。 しかし、Workbook_Open()で現在エクセルのある場所に変えても、宣言の部分には適用できないらしく関数を呼ぶと、Dllを探せません。っていうエラーメッセージが出ます。この解決方法はないでしょうか。 つまりDLLを動的に呼び出したいです。

回答No.3

>エクセルシート(AA.xsl)を開くときに、エクセルの『ツール/オプション/全般/カレントフォルダ名』をエクセルシート(AA.xsl)のディレクトリ名にすることはできないでしょうか。 ↓こんな感じで、Workbook_Openイベントプロシージャに書けばできるみたいです。 Private Sub Workbook_Open()   ChDir Me.Path End Sub

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

xlsの中から呼んでいるということなので、アプリケーションの実行時のフォルダが、ファイルがあるフォルダではなくなっています。(おそらくexcel.exeがあるフォルダ) なので、xlsでDLLを呼び出す際か、DLL中でiniファイルを探す前に、xlsやDLLが今どこにあるかを探す必要があります。 ちなみに、BB.DLLはどんな言語で作られたのでしょう?

jaekuk
質問者

補足

ご回答有難うございます。 回答1の通り、エクセルのカレントディレクトリに設定されているディレクトリを探すらしいです。 エクセルシート(AA.xsl)を開くときに、エクセルの『ツール/オプション/全般/カレントフォルダ名』をエクセルシート(AA.xsl)のディレクトリ名にすることはできないでしょうか。 >ちなみに、BB.DLLはどんな言語で作られたのでしょう? VC6.0で作られています。

回答No.1

DLL を呼び出す側( Excel )のカレントフォルダが DLL とは別のフォルダになっているからではないでしょうか。 FindFile("C:\XXX\CC.INI"); のようにフルパスで指定しなければだめなんでしょう。 ちなみに、INI ファイルの読み込みを行うのなら、 GetPrivateProfileString とかの API を使用するのが便利だと思います。

関連するQ&A