Я очень новичок в программировании программного обеспечения. Я работал над проектом C ++ (используя Code :: Blocks) и пытался получить результаты от сторонней библиотеки DLL, написанной на Visual C ++ 2010. До сих пор я мог загрузить DLL с помощью LoadLibrary () и получить адрес функции с помощью GetProcAddress (). Но я не уверен, как мне двигаться дальше, чтобы получить значимые результаты. Информация из стороннего руководства по DLL не очень понятна, по крайней мере, для меня. Я был бы очень признателен, если кто-то может указать мне правильное направление, пожалуйста.
DLL информация:
Calcdll.dll функция экспорта StartJob.
StartJob, который принимает три параметра
double aInputData[NINPUTDATA], specifies input data
VARIANT aResData[NRESDATA], contains calculation results
VARIANT aOptions[NOPTIONSDATA], specifies optional flags (for future use)
NINPUTDATA: 100
NRESDATA: 100
NOPTIONSDATA 1
Использование из C ++
// Calcdlld.h is located in the installation directory together
// with calcwin.dll and calcwin.lib
#include “calcdlld.h”
void CCalcdllsvrView::OnCalcolo()
{
// TODO: Add your control notification handler code here
VARIANT aRis[NRESDATA];
double aInp[NINPUTDATA];
double aOpt[NOPTIONSDATA];
// Collect data from input mask
GetData(vInp);
// Check for errors
if (!StartJob(aInp, aRis, aOpt))
return;
// Show results
ShowResults(aRis);
}
/*
Link Calcdll.lib together with your files.
Warning: positions 14,15 and 30 of the output array contain BSTR values, so in order to convert them to CString (in
Visual C++) is possible to create an instance of the class CString passing aRis[n].bstrVal to the constructor (see
VARIANT structure declaration):
*/
CString coilDescription (aRis[29].bstrVal);
AfxMessageBox(CString(“Coil type: “) + coilDescription);
//Contents of calcdlld.h
#define NINPUTDATA 100
#define NOPTIONSDATA 1
#define NRESDATA 100
extern "C" BOOL FAR PASCAL EXPORT StartJob(double vInp[NINPUTDATA], VARIANT vRis[NRESDATA], double vOpt[NOPTIONSDATA]);
Мой код
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
#include <windows.h>
int main() {
double vInp[100];
VARIANT vRis[100];
double vOpt[1];
for (int i = 0; i < 100; i++ ) {
vInp[i] = 0;
}
//vInp[] = ;
vInp[0] = 2;
vInp[1] = 25;
vInp[8] = 1;
vInp[9] = 45;
vInp[14] = 2;
vInp[15] = 48;
vInp[16] = 2;
vInp[17] = 16;
vInp[18] = 11250;
vInp[26] = 45;
vInp[28] = 2.41627;
vInp[40] = 1;
vInp[45] = 1;
vInp[50] = 14;
vInp[51] = 2.2;
vInp[60] = 1;
vInp[61] = 0.11;
vInp[62] = 0.35;
vInp[63] = 203;
vInp[77] = 2;
cout << "vInp" << endl;
for (int i = 0; i < 100; i++ ) {
cout << i << ": " << vInp[i] << endl;
}
cout << "Start!" << endl;
typedef int (__stdcall *f_StartJob)(double vInp[100], VARIANT vRis[100], double vOpt[1]);
HINSTANCE hGetProcIDDLL = LoadLibrary("C:\\......\\calcdll.dll");
if (!hGetProcIDDLL) {
cout << "could not load the dynamic library" << endl;
return EXIT_FAILURE;
} else {
cout << "DLL loaded!" << endl << endl;
}
// resolve function address here
f_StartJob StartJob = (f_StartJob)GetProcAddress(hGetProcIDDLL, "StartJob");
if (!StartJob) {
cout << "could not locate the function" << endl;
return EXIT_FAILURE;
}
cout << "StartJob() returned " << StartJob(vInp, vRis, vOpt) << endl;
cout << vRis << endl;
return EXIT_SUCCESS;
}
Большое спасибо заранее!