不能从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;
}