我必须处理一些非常古老的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这样的线程没有提供答案。
提前致谢。
答案 0 :(得分:2)
所以感谢非常快速的响应以及指向非常有用的工具的链接Dependency Walker我发现问题出在功能名称上。虽然我花了一些时间来改变“test_fort”的情况并在其中添加“_”等符号,但我错过了“TEST_FORT”变体 - 这是.dll中“test_fort”FORTRAN函数的别名。 因此,要使其正常工作,我只需更改一行代码:
FARPROC result = GetProcAddress(hFortDll, "TEST_FORT");