DLLの呼び出し方法


E-PROPATHとして配布されているDLLをMS-Excel,Visual Basic,Visual FortranおよびDelphiから 呼び出す(インポートする)方法を説明し,いくつかの利用例を示す. Visual C/C++からの利用はここにまとめた.

現在のE-PROPATHではP-PROPATH,A-PROPATHおよびM-PROPATHの各関数およびサブルーチンが 提供されており,これらはPROPATH関数と同じ関数名か"J+(物質名)_(関数名)"の 形の関数名のどちらも呼び出せるようになっている. 例えばアンモニアPROPATHのPST関数ならば, "PST"あるいは"JNH3_PST"のいずれでも呼出しが可能である.

他言語で作成したプログラムからDLLを呼び出す場合, 静的インポートと動的インポートのいずれかを選択することができる. いずれもプログラムの実行時にリンクされることには変わりがないが, リンクされる時期に違いがある. いわゆるDLLの動的リンクとスタティックライブラリの静的リンクと の違いとは意味が異なる.

静的インポートとして宣言したDLLは, プログラムの起動時にメモリ上にロードされてプログラムにリンクされ,プログラムの 実行中はずっとメモリ上に存在し,プログラムの終了時にメモリ上から開放される. 静的インポートのための手続きは比較的容易であるが,多くのDLLをロードする場合は プログラムの起動に時間がかかる. また,一つでもインポートに失敗した関数があった場合,プログラムの起動は 直ちに中断される.

一方,動的インポートは,プログラムの実行中, 対象となるインポート関数が呼ばれる段階になって初めてメモリ上にロードされてプログラムにリンクされる. インポート関数の呼び出しが終了した時点でDLLはメモリ上から開放される. 多くの関数をインポートする場合,動的インポートの方がより効率的であるが, インポートのための手続きはポインタ操作を必要とし,静的インポートよりも若干複雑である.

MS-ExcelおよびVisual Basicでは明示的にポインタを扱うことができないので, DLLの利用は静的インポートに限定される. Visual FortranおよびDelphiでは,状況に応じて静的インポートと動的インポートを 使い分けることができる.

いずれのインポートにしても,Windowsは以下の順序でDLLを検索し,最初に 見つかったDLLをロードする.

  1. プログラムがあるディレクトリ
  2. カレントディレクトリ
  3. Windowsシステムディレクトリ
  4. Windowsディレクトリ
  5. 環境変数PATHで指定されたディレクトリ

なお,DLLが絶対パス付きで指定された場合はこの限りではない.

MS-Excel
Visual Basic
Visual Fortran
Delphi


  1. MS-Excel

    E-PROPATHでは,すべてのDLLについてExcelのマクロ言語でインポート関数を 宣言したファイル(インポートファイル(一般的な用語ではない)を提供している. したがって,あらためてインポート関数の宣言を書く必要はなく,インポートファイルを Excelのブックに取り込むだけで直ちにDLLを利用することができる.

    ただし,Excelからの利用では,圧力および温度の単位がそれぞれ[bar]および[℃]に 限定される. また,E-PROPATHが提供するインポートファイルに宣言されているのは関数のみであり, M-PROPATHのサブルーチンも複数の関数呼出しに置き換えられたものが宣言されている.

    Excelのマクロ言語はVBA(Visual Basic for Application)と呼ばれる Visual Basicのサブセットであり,E--PROPATHが提供するインポートファイルはそのまま Visual Basicでも利用することができる. 以下はアンモニアPROPATHのインポートファイルJNH3.BASをExcelのブックに取り込む手順である.

    1. Excelを起動し,[ツール] - [マクロ] - [Visual Basic Editor]を選択する.

    2. Visual Basic Editorで,[ファイル]--[ファイルのインポート]を選択し, JNH3.BASを指定して[開く]を押す.

    3. 以上で指定したインポートファイルがブックに取り込まれる. Excelに戻り,"=PST(100)"と入力すれば"62.35047913"と表示されるはずである. もし,"#NAME"や"#VALUE"などが表示された場合は, JNH3.DLLが適切なディレクトリに存在しているかを確認する.

    一旦ブックに取り込んだインポートファイルは,そのブックを保存する際に一緒に保存される. したがって,次回ブックを開く際に上記作業は必要なく,すぐにDLLを利用できる. 文字を引数とする関数の場合,文字を"(ダブルクォーテーション)で囲む. 例えば,"=FC("M")"のようにする.


  2. Viaual Basic

    E-PROPATHが提供するインポートファイルはVisual Basicの標準モジュールである. したがって,インポートファイルをVisual Basicのプロジェクトに追加するだけで, 直ちにDLLを利用することができる.

    ただし,"J+(物質名)_(関数名)"の関数名で呼び出すときや サブルーチンを呼び出すときはユーザー側で関数宣言を書かなければならない. 以下はフォームモジュールに書いた関数宣言の例である.

       Private Declare Function JN2_TSP _ 
          Lib "jn2.dll" (ByVal P As Single)  As Single
       Private Declare Function JH2O_HPT _  
          Lib "jh2o.dll" (ByVal P As Single, ByVal T as Single)  As Single
       Private Declare Function JNH3_FC _ 
          Lib "jnh3.dll" (ByVal C As String) As Single
       Private Declare Sub SUBXY Lib "jawmx.dll" (ByRef J As Long, _ 
         ByVal T  As Single, ByVal P  As Single, ByRef X  As Single, _ 
         ByRef Y  As Single, ByRef VL As Single, ByRef VV As Single, _ 
         ByRef HL As Single, ByRef HV As Single, ByRef SL As Single, _ 
         ByRef SV As Single)
    

    注意事項を列挙しておく.

    以下のリストは,JAWMX.DLLを利用してアンモニア-水混合物の1barにおける 平衡組成を270Kから300Kまで5Kごとに計算する例である.

      Private Declare Sub KPAMES Lib "jawmx.dll" (ByVal Kpa As Long, _ 
                                                  ByVal Mes As Long)
      Private Declare Sub STNKAS Lib "jawmx.dll" (ByVal Kstn As Long, _ 
                                                  ByVal Kas  As Long)
      Private Declare Sub SUBXY Lib "jawmx.dll" (ByRef J As Long, _
                          ByVal T  As Single, ByVal P  As Single, _
                          ByRef X  As Single, ByRef Y  As Single, _
                          ByRef VL As Single, ByRef VV As Single, _
                          ByRef HL As Single, ByRef HV As Single, _
                          ByRef SL As Single, ByRef SV As Single)
    
      Private Sub GoBtn_Click()
      Dim P As Single, T As Single, X As Single, Y As Single
      Dim VL As Single, VV As Single, HL As Single, HV As Single
      Dim SL As Single, SV As Single
      Dim IT As Long, J As Long
      Dim Item As ListItem
      
        Call KPAMES(2, 0)
        Call STNKAS(0, 0)
        P = 1#
        For IT = 270 To 300 Step 5
          T = IT
          Call SUBXY(J, T, P, X, Y, VL, VV, HL, HV, SL, SV)
          Set Item = ResultList.ListItems.Add
          Item.Text = IT
          Item.SubItems(1) = Format(X, "0.00000")
          Item.SubItems(2) = Format(Y, "0.00000")
        Next IT
     
     End Sub
    


  3. Viaual Fortran


  4. Delphi


お問い合わせはメールにて: akasaka@klc.ac.jp

戻る
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送