『Compaq Visual Fortran Programmer's Guide』の FortranCall サンプルは、Visual Basic から DLL 中の Fortran ルーチンを呼び出す例を示しており、幾つかのエラーがあります。以下の手順は、正しく動作するサンプルの作成方法と文字列引数の渡し方を示しています。
注意:この例は、Visual Basic 6.0 を使ってテストをしています。そのため、Visual Basic のこれ以前のバージョンでは動作しないかもしれません。
Developer Studio で「Fortran Dynamic-Link Library」プロジェクト・タイプの FCALL という名前のプロジェクトを作成します。
以下のコードを持つ FCALL.F90 という名前の自由形式ソース・ファイルを作成します。
! VB-Fortran DLL 例の Fortran 部分。
! DLL_ROUT ルーチンは、VB 実行形式プログラム
! から呼び出されます。
!
SUBROUTINE DLL_ROUT (INT_ARG, STR_IN, STR_OUT)
IMPLICIT NONE
! DLL_ROUT が DLL にエクスポートされ、
! 外部名が DLL_OUT であることを指定します。
!
!DEC$ ATTRIBUTES DLLEXPORT :: DLL_ROUT
!DEC$ ATTRIBUTES ALIAS:'DLL_ROUT' :: DLL_ROUT
INTEGER INT_ARG
CHARACTER*(*) STR_IN, STR_OUT
! このルーチンは、INT_ARG を文字列に変換し、
! 文字列を STR_IN に追加し、その結果を STR_OUT
! に保存します。
!
! 各 CHARACTER 引数のアドレスの後に隠された
! 文字長引数があることに注意してください。
!
CHARACTER*5 INT_STR
WRITE (INT_STR,'(I5.5)')INT_ARG
STR_OUT = STR_IN // INT_STR
RETURN
END
DLL をビルドします。
Visual Basic を起動し、「標準 EXE」プロジェクトを作成します。コントロール・ツールバーで「CommandButton」アイコンをクリックし、フォーム上にカーソルを移動し、コマンド・ボタンを描画します。描画したコマンド・ボタンのプロパティ・ボックスで「Caption」をダブルクリックし、「Do it!」とタイプしてタイトルを変更します。コントロール・ツールバーで「TextBox」アイコンをクリックし、フォーム上にカーソルを移動し、テキスト・ボックスを描画します。描画したテキスト・ボックスのプロパティ・ボックスで「Text」をダブルクリックし、空文字列に変更します。
フォーム上の「Command1」ボタンをダブルクリックすると、「コード」画面が表示されます。以下にコードを書き込みます。
Private Sub Command1_Click()
Static STR_IN As String * 10
Static STR_OUT As String * 20
INT_ARG = 123
STR_IN = "Testing..."
Rem 文字引数の長さを渡します。
Rem
Call DLL_ROUT(INT_ARG, STR_IN, Len(STR_IN), _
STR_OUT, Len(STR_OUT))
MsgBox (STR_OUT)
End Sub
メニューバーから「プロジェクト」を選択し、「標準モジュールの追加」を選択し、そして表示される画面で「開く」をクリックして新しいモジュールを作成します。以下のコードをモジュールに書き込みます。この例は、表示上の問題からFcall.dll のディレクトリ指定部分を複数行に分割して示しています。そのため、書き込む場合、1 行になるように編集してください。下線 (_) は、Basic の行継続文字です。
Declare Sub DLL_ROUT Lib _
"c:\Program Files\DevStudio\
My Projects\Fcall\Debug\Fcall.dll" _
(INT_ARG As Long, _
ByVal STR_IN As String, _
ByVal STR_IN_LEN As Long, _
ByVal STR_OUT As String, _
ByVal STR_OUT_LEN As Long)
上記の例の Fortran DLL のディレクトリなどが実際と異なる場合、正しいディレクトリ、ファイル名に変更してください。
「F5」キーを押して Basic プログラムを実行します。「Do it!」ボタンをクリックします。INT_ARG を文字列に変換し、その文字列を STR_IN に追加し、その結果を STR_OUT に保存ために Fortran ルーチンが呼び出されます。Basic コードは、テキスト・ボックスにその結果を表示します。
注意:Fortran と同様に Visual Basic は、参照渡しで数値 (整数や実数) を渡します。そのため、Fortran と Basic の両方でデータの渡し方を変更する必要はありません。ALIAS 属性は必要です。これは、Visual Basic が STDCALL 呼び出しメカニズムを使用するにもかかわらず、Visual Basic が @n 接尾辞でルーチン名を装飾しないためです。この Fortran ルーチンが他の Fortran コードからも呼び出されている場合、Basic 側で Alias オプションを使用して適切な接尾辞をもつ名前に変更しなければなりません。
文字列を渡す場合、Visual Basic 側で ByVal を使わなければなりません。基本設定では、Visual Basic は文字列を OLE BSTRING 形式として文字列を渡します。この形式は、Fortran が直接使用できるものではありません。ByVal を指定することで、Visual Basic が文字列の ASCII バージョンのアドレスを渡すようになります。Visual Fortran の基本設定では、Visual Fortran は文字列引数がアドレスで渡され、その後に、値で隠された文字長を示す整数引数が別個に渡されることを仮定しています。これは、上記の例が文字列引数の長さを明示的に渡している理由です。
|