【问题标题】:C++ calling FORTRAN subroutine from dllC++ 从 dll 调用 FORTRAN 子例程
【发布时间】:2015-04-10 12:09:03
【问题描述】:

我必须处理一些非常古老的 FORTRAN 代码,但我想在 C++ 中使用 FORTRAN 中的一些函数。现在我有一个小项目要练习导出 FORTRAN dll 并在 C 中导入它。我在 Windows 上使用 FORTRAN 和 Visual C++ 的 FTN95 编译器进行操作。我的 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

调试器显示 result 包含零地址 (0x00000000)。我不知道我做错了什么,像this 这样的线程没有提供答案。

提前致谢。

【问题讨论】:

  • 使用 depends (dependencywalker.com) 找出实际调用的 fortran 例程。它可能有前导或尾随下划线,也可能完全大写。
  • 还要小心你使用的是 Unicode - Fortran 通常是 ASCII。
  • 我知道我使用的是 Unicode。但是据我所知,使用 Unicode 加载库是可以的,并且 GetProcAddress 具有 LPCSTR 类型的第二个参数,而不是 LPCWSTR。所以应该没问题,但我会检查

标签: c++ c dll fortran


【解决方案1】:

感谢非常快速的响应和指向一个非常有用的工具Dependency Walker 的链接,我发现问题出在函数名称上。虽然我花了一些时间更改“test_fort”的大小写并向其添加诸如“_”之类的符号,但我错过了“TEST_FORT”变体——这是 .dll 中“test_fort”FORTRAN 函数的别名。 所以,为了让它工作,我只需要修改一行代码:

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

【讨论】:

    猜你喜欢
    • 2014-01-14
    • 2012-01-02
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 2019-07-08
    • 2016-10-13
    • 2016-03-09
    • 2012-05-03
    相关资源
    最近更新 更多