C++调用fortran生成的DLL

不能从const char *转换为LPCWSTR问题,可以使用TEXT函数解决

C++代码

#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <float.h>
#include <stdlib.h>
typedef void(*LPFNDLLFUNC1)(char *c, const int len);
typedef int(*LPFNDLLFUNC2)(int input);
typedef float(*LPFNDLLFUNC3)(float input);

// 只要有一个定义成传址,其它所有参数都得设定成传址。可能跟DLL机制有关系? 
typedef float(*LPFNDLLFUNC4)(int* length, float* input);
typedef float(*LPFNDLLFUNC5)(float* input, int* length, float* q);

typedef int(*LPFNDLLFUNC6)(float* input, int* row, int* col);


int main(int argc, char** argv) {
	printf("double MAX=%le, MIN=%le\n", DBL_MAX, DBL_MIN);
	printf("float MAX=%le, MIN=%le\n", FLT_MAX, FLT_MIN);
	
	const int lenmax = 30, numstr = 3; // changed char length to 30 to fit in the terminal
	char a[numstr][lenmax];
	std::string str[numstr];

	str[0] = "moon"; str[1] = "mercury"; str[2] = "jupiter";

	for (int k = 0; k < numstr; k++) {
		memset(a[k], ' ', lenmax);  // fill space
		//str[k].copy(a[k], lenmax);  // copy at most lenmax char (no \0 attached)
		int i = 0;
		for (; i < str[k].length();i++) {
			a[k][i] = str[k][i];
		}
//		a[k][i] = '\0';
		std::cout << a[k] << std::endl;
	}
	// C:\Users\liangzl2\Documents\Visual Studio 2015\Projects\fortranDLLExample\fortranDLLExample\Debug\fortranDLLExample.dll
	HINSTANCE hDLL = LoadLibrary(TEXT("fortranDLLExample.dll"));
	// 使用这种调入DLL的方法,在链接器上不需要特殊处理。 
	if (hDLL == NULL){
		std::cout << "Failed to load library.\n";
	}else{
		LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
		lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "func01");
		lpfnDllFunc1(a[0], lenmax);
		
		LPFNDLLFUNC2 TSAT11;    // Function pointer
		TSAT11 = (LPFNDLLFUNC2)GetProcAddress(hDLL, "TSAT11");
		int a=704;
		// fortran里面的类型一定要搞对!!!是interger(type=4)或者默认type,对应cpp里面的int 
		std::cout<<"TSAT11(704)=="<<TSAT11(a)<<std::endl;
		
		LPFNDLLFUNC3 TSAT;    // Function pointer
		TSAT = (LPFNDLLFUNC3)GetProcAddress(hDLL, "TSAT");
		float b=500.0;
		// fortran里面的类型一定要搞对!!!是real,对应cpp里面的float,而不是double 
		std::cout<<"TSAT(500.0)=="<<TSAT(b)<<std::endl;
		
		LPFNDLLFUNC4 sum;    // Function pointer
		sum = (LPFNDLLFUNC4) GetProcAddress(hDLL, "sum");
		float c[]={11.0, 44.55, 66.44, 43.23, 6.32, 88.43};
		int l = sizeof(c) / sizeof(c[0]);
		std::cout<<"length=="<<l<<"; sum(500.0)=="<<sum(&l, c)<<std::endl;
		
		LPFNDLLFUNC5 sum2;    // Function pointer
		sum2 = (LPFNDLLFUNC5) GetProcAddress(hDLL, "sum2");
		float cc[]={11.0, 44.55, 6.32, 88.43};
		l = sizeof(cc) / sizeof(cc[0]);
		float q1 = 10.2;
		std::cout<<"length=="<<l<<"; sum2([11.0, 44.55, 6.32, 88.43])=="<<sum2(cc, &l, &q1)<<std::endl;
		
		
		
		LPFNDLLFUNC6 array2by2;    // Function pointer
		array2by2 = (LPFNDLLFUNC6) GetProcAddress(hDLL, "array2by2");
		float ccc[]={1.1, 1.2, 1.3, 1.4,
                         2.1, 2.2, 2.3, 2.4,
                         3.1, 3.2, 3.3, 3.4,
                         4.1, 4.2, 4.3, 4.4};
//		float ccc0[] = {11.0, 44.55};
//		float ccc1[] = {6.32, 88.43};
//		float* ccc[2]= {ccc0, 
//					    ccc1};
		
		int row, col;
		row = 4;
		col = 4;
		std::cout<<"length=="<<l<<"; array2by2([11.0, 44.55, 6.32, 88.43])=="<<array2by2(ccc, &row, &col)<<std::endl;

	}
	FreeLibrary(hDLL);
	return 0;
}

猜你喜欢

转载自my.oschina.net/u/2996334/blog/1807924
今日推荐