Здравствуйте, Pavel_O, Вы писали:
P_O>Здравствуйте.
P_O>Мне необходимо подключить DLL библиотеку написанную на фортране (библиотека скомпилина в MS FORTRAN 5.1 с одним внешним SUBROUTINE).
А он разве умеет 32-битовые DLL строить? Если не ошибаюсь, FORTRAN 5.1 выпущен где-то в 90-м или 91-м году.
P_O>В этой библиотеке мне необходимо задать около 200 переменных, описанных в COMMON блоках.
Когда в FORTRAN-е объявляется COMMON-блок, снаружи видно только его имя, а не его составляющих.
Мне в свое время приходилось связывать модули, написанные на C и на FORTRAN-е, кажется, этом же 5.1 или 5.0.
Если в FORTRAN-овской программе был объявлен COMMON-блок
P_O>например
P_O>P_O>COMMON /O1/ P1, P2, P3(5)
P_O>
то в C-программе я делал так:
struct _O1
{
float P1, P2, P3;
}
extern fortran _O1 O1;
У меня была не DLL, я все собирал в один EXE.
P_O>в основной программе описана структура
P_O>P_O>struct
P_O>{
P_O> float
P_O> P1,
P_O> P2,
P_O> P3[5];
P_O>} O1;
P_O>
P_O>1) Могу ли я таким образом задаваь переменые?
P_O>P_O>int *pVar;
P_O>(FARPROC &)pVar = GetProcAddress(hLib, "P1");
P_O>*pVar = O1.P1;
P_O>
Так — нет. Снаружи видно только имя COMMON-блока, а не его членов. Имя P1 никому ничего не скажет.
P_O>2) Могу ли я передать структуру и присвоить ее блоку COMMON
Тут нужен указатель не на int, а на структуру, которая COMMON-блок описывает. Тогда у тебя будет нормальный доступ к ее членам.
P_O>P_O>int *pVar;
P_O>(FARPROC &)pVar = GetProcAddress(hLib, "/O1/");
P_O>*pVar = O1;
P_O>
Сдается мне, надо несколько иначе:
P_O>P_O>O1 *pVar;
P_O>pVar = (_O1 *)GetProcAddress(hLib, "O1");
P_O>
Дальше в C-программе можно делать, как обычно:
extern fortran _O1 O1;
//............
float f()
{
O1->P1 = 0.0f;
return O1->P1;
}
Не уверен насчет синтаксиса C#.
Еще один момент — соглашения о связях. Я не знаю, что скажет C# при вызове функции из такой DLL. Необходимо проверять.
Ну, и то, что я тут спросонок понаписал, нужно как следует проверить. У меня под рукой нет компилятора FORTRAN. Поэтому сам не могу.
Удачи!