【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集

WindowsXP+OFFICE2000環境です。

ファイルの構成は同じホルダの中に
AA.xls、BB.DLL、CC.iniになっています。

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

A 回答 (5件)

DefaultFilePathって、規定のパスを変えるだけなので、


カレントは変更されていません。

なので、呼べません。
で、カレントを変えるのは、#3の方が書かれているChDirです。

で、DLLの検索順ですが、Windowsではここに書かれている順序で行われます。
http://www.microsoft.com/japan/msdn/library/defa …

なんで、一番安全で確実なのは、Pathを通すことです。
    • good
    • 0

>エクセルシート(AA.xsl)を開くときに、エクセルの


>『ツール/オプション/全般/カレントフォルダ名』を
>エクセルシート(AA.xsl)のディレクトリ名にすることは
>できないでしょうか。

出来ますけど、カレントディレクトリって、一度設定したらそのままってものじゃないですよ。
一番ありがちなのが、ファイル選択のコモンダイアログを開いたときなんかはカレントディレクトリは開いたところに移動します。
なんで、カレントを設定しなおすのはお勧めしません。

DLLと同じ場所にあるのでしたら、AfxGetInstanceHandleと
GetModuleFileNameでDLLの場所を取得し、INIファイルはフルパスで指定することをお勧めします。

この回答への補足

ご回答有難うございます。

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を動的に呼び出したいです。

補足日時:2004/01/13 17:39
    • good
    • 0

>エクセルシート(AA.xsl)を開くときに、エクセルの『ツール/オプション/全般/カレントフォルダ名』をエクセルシート(AA.xsl)のディレクトリ名にすることはできないでしょうか。



↓こんな感じで、Workbook_Openイベントプロシージャに書けばできるみたいです。

Private Sub Workbook_Open()
  ChDir Me.Path
End Sub
    • good
    • 0

xlsの中から呼んでいるということなので、アプリケーションの実行時のフォルダが、ファイルがあるフォルダではなくなっています。

(おそらくexcel.exeがあるフォルダ)

なので、xlsでDLLを呼び出す際か、DLL中でiniファイルを探す前に、xlsやDLLが今どこにあるかを探す必要があります。

ちなみに、BB.DLLはどんな言語で作られたのでしょう?

この回答への補足

ご回答有難うございます。
回答1の通り、エクセルのカレントディレクトリに設定されているディレクトリを探すらしいです。

エクセルシート(AA.xsl)を開くときに、エクセルの『ツール/オプション/全般/カレントフォルダ名』をエクセルシート(AA.xsl)のディレクトリ名にすることはできないでしょうか。

>ちなみに、BB.DLLはどんな言語で作られたのでしょう?
VC6.0で作られています。

補足日時:2004/01/11 16:01
    • good
    • 0

DLL を呼び出す側( Excel )のカレントフォルダが DLL とは別のフォルダになっているからではないでしょうか。


FindFile("C:\XXX\CC.INI");
のようにフルパスで指定しなければだめなんでしょう。
ちなみに、INI ファイルの読み込みを行うのなら、
GetPrivateProfileString とかの API を使用するのが便利だと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報