以下は、Microsoft Visual C/C++ の主プログラムが DLL 中の Visual Fortran のルーチンを呼び出す言語が混在したプログラミングの例です。Fortran ソースを C/C++ ソースとして同じプロジェクトに追加する(そして DLL に関連した指示文を削除する)ことで、DLL を使わないように修正することもできます。以下の説明では、Microsoft Visual C/C++ 6.0 がインストールされ、Visual Fortran 6.0 以降とビジュアル開発環境を共有していることを前提としています。
VC_Example という名前の主プログラム用の「Fortran Console Application」プロジェクトを作成します。この時、「An empty project」を選択してプロジェクトを作成します。
このプロジェクトで cmain という名前の C/C++ ソース・ファイルを作成し (基本ファイル拡張子は .cpp)、以下のコードを入力します。
/*
* Fortran DLL を呼び出す
* C++ で書かれた主プログラム
*/
#include <stdio.h>
#include <string.h>
/*
* Fortran ルーチンを宣言します。
* 以下のことに注意してください。
*
* - "C" 属性は、C++ の装飾名を禁止します。
* - ファイル拡張子が .c の場合、
* これを取り除きます。
* - dllimport の指定が必要です。
* - Fortran ルーチンは、基本設定では
* _stdcall インタフェースを使用します。
* - Fortran 文字引数は、アドレスの後に
* 隠された文字長引数を持ちます。
* - ルーチン名は、Fortran と一致させる
* ために大文字にしなければなりません。
*/
extern "C" __declspec(dllimport)
void _stdcall
DLL_ROUT (int *INT_ARG, char *STR_IN,
int STR_IN_LEN, char *STR_OUT,
int STR_OUT_LEN);
void main (int argc, char *argv[])
{
char instring[40];
char outstring[40];
int intarg;
strcpy(instring,"Testing...");
intarg = 123;
/*
* Fortran ルーチンを呼び出します。
* intarg を参照で渡し、outstring の
* 長さを明示的に値で渡します。
*/
DLL_ROUT(&intarg,instring,
strlen(instring),outstring,40);
printf("%s\n",outstring);
}
「Fortran Dynamic Link Library」プロジェクトを新規に作成し、「Add to current workspace」と「Dependency of」のチェックボックスにチェックを入れ、プロジェクト名に VF_DLL という名前をつけます。
このプロジェクトで dll_rout という名前の Fortran 自由形式ソース・ファイルを作成し (基本ファイル拡張子は .f90)、以下のコードを入力します。
! C-Fortran DLL 例の Fortran 部分。
! DLL_ROUT ルーチンは、C 実行形式
! プログラムから呼び出されます。
!
SUBROUTINE DLL_ROUT (INT_ARG, STR_IN, &
STR_OUT)
IMPLICIT NONE
! DLL_ROUT は DLL にエクスポートされる
! ことを指定します。
!
!DEC$ ATTRIBUTES DLLEXPORT :: DLL_ROUT
INTEGER INT_ARG
CHARACTER*(*) STR_IN, STR_OUT
! このルーチンは、INT_ARG を文字列に
! 変換し、文字列を STR_IN に追加し、
! 結果を STR_OUT に保存します。
! 最後にヌルを C 言語のために追加します。
!
! 各 CHARACTER 引数のアドレスの後に
! 隠された文字長引数があることに
! 注意してください。
!
CHARACTER*5 INT_STR
WRITE (INT_STR,'(I5.5)')INT_ARG
STR_OUT = STR_IN // INT_STR // CHAR(0)
RETURN
END
「ビルド」メニューから「Set Active Configuration」を選択し、表示される画面でアクティブな設定として実行形式プロジェクトの VC_Example を選択します。「Build」ボタンをクリックします。まず、Fortran コードがビルドされ、続いて C コードがビルドされ、最後にリンクが行われます。DLL プロジェクトがサブプロジェクトであるため、DLL プロジェクトが先にビルドされ、その .LIB が自動的に主プログラムに含まれるということに注意してください。
DLL プロジェクトの \Debug (または \Release) サブディレクトリから VF_DLL.DLL ファイルを手動で .EXE ファイルがあるディレクトリにコピーします。
プログラムを実行します。コンソール・ウィンドウに「Testing...00123」と表示されます。
|