C ++从dll调用FORTRAN子例程

时间:2015-04-10 12:09:04

标签: c++ c dll fortran

我必须处理一些非常古老的FORTRAN代码,但我想在C ++中使用FORTRAN中的一些函数。现在我有一个小项目来练习导出FORTRAN dll并用C导入它。我在Windows上使用FTN95编译器为FORTRAN和Visual C ++做。我的fortran源包含此功能:

F_STDCALL integer function test_fort(a)
            implicit none
            integer, intent(in) :: a
            test_fort = 2*a
    end function

我将其编译成FORT.dll,然后将其放入我的C ++项目的输出文件夹中。 C ++源代码:

#include<stdlib.h>
#include<Windows.h>
#include<stdio.h>

typedef int(__stdcall *test_fort)(int* a);

int main()
{
    HMODULE hFortDll = LoadLibraryW(L"FORT.dll");

    if (hFortDll == NULL)
        wprintf(L"Error loading FORT.dll");
    else
    {
        wprintf(L"Loading successful\r\n");
        FARPROC result = GetProcAddress(hFortDll, "test_fort");
        test_fort fortSubroutine = (test_fort)result;

        if (fortSubroutine == NULL)
            wprintf(L"Function not found\r\n");
        else
            wprintf(L"Function successfully loaded\r\n");

        FreeLibrary(hFortDll);
    }

    getchar();

    return 0;
}

如果我运行此代码,我会得到以下输出:

Loading successful
Function not found

调试器显示结果包含零地址(0x00000000)。我无法弄清楚我做错了什么,像this这样的线程没有提供答案。

提前致谢。

1 个答案:

答案 0 :(得分:2)

所以感谢非常快速的响应以及指向非常有用的工具的链接Dependency Walker我发现问题出在功能名称上。虽然我花了一些时间来改变“test_fort”的情况并在其中添加“_”等符号,但我错过了“TEST_FORT”变体 - 这是.dll中“test_fort”FORTRAN函数的别名。 因此,要使其正常工作,我只需更改一行代码:

FARPROC result = GetProcAddress(hFortDll, "TEST_FORT");