Получение результатов от сторонней DLL в C ++ - PullRequest
0 голосов
/ 14 февраля 2020

Я очень новичок в программировании программного обеспечения. Я работал над проектом 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;

}

Большое спасибо заранее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...