Как вызвать DLL, созданную LabVIEW с переполнением стека

рад тебя видеть!
это мой первый пост в stacoverflow.
Я изучаю C ++ и LabVIEW для собственного образования.

LabVIEW — это среда программирования графического дизайна, которая может создавать DLL из кода LabVIEW.
«Создание DLL из кода LabVIEW»https://decibel.ni.com/content/docs/DOC-15556

Я построил простую DLL и пытаюсь вызвать ее из кода C ++.
мы можем суммировать A и B с помощью DLL.
Сначала я сделал исходный код следующим образом.

#include "stdafx.h"#include <Windows.h>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDLL = LoadLibrary(TEXT("C:\\sum_dll.dll"));
if(hDLL == NULL){
cout << "error" << endl;
}

FARPROC lpIO = GetProcAddress(HMODULE(hDLL),"Sum_dll");

typedef int (*FUNC)(int a, int b);

FUNC myFunc;
myFunc = FUNC(lpIO);

int myValue = myFunc(2,32);

cout << myValue << endl;

FreeLibrary(hDLL);
return 0;
}**************************** DLL header file ****************************

#include "extcode.h"#pragma pack(push)
#pragma pack(1)

#ifdef __cplusplus
extern "C" {
#endif

/*!
* Sum_dll
*/
int32_t __cdecl Sum_dll(int32_t A, int32_t B);

MgErr __cdecl LVDLLStatus(char *errStr, int errStrLen, void *module);

#ifdef __cplusplus
} // extern "C"#endif

#pragma pack(pop)

*****************************************************************************

2

Решение

Предполагая третий аргумент myFunc обозначает сумму:

Сигнатуры функций не совпадают. myFunc возвращает void, но указатель вашей функции typedef говорит, что возвращает int. Поведение не определено, когда вы делаете это (я удивлен, что программа не вылетала).

typedef void (*FUNC)(int32_t, int32_t, int32_t*);

Кроме того, вы должны соответствовать именно так типы, которые ожидает экспортированная функция DLL. В typedef, вы говорите int, но функция принимает int32_t,

Учитывая исправления выше, другие проблемы:

1) При звонке должен пройти адрес myValue

2) Функция DLL возвращает void, поэтому нет смысла использовать ее в cout,

myFunc(2,3,&myValue);
cout << "myValue = " << myValue << endl;
1

Другие решения

Спасибо за ваш комментарий.

Я изменил свой источник C ++ следующим образом.
Не было сбоя и вернул правильное значение.

Я полагаю, что я должен изучить C ++ указатель и тип переменной.
Огромное спасибо!!

#include "stdafx.h"#include <Windows.h>
#include <iostream>
#include <cstdint> //shoud be called to use int32_t
using namespace std;

//define the type of function
typedef void (*FUNC)(int32_t, int32_t,int32_t *);int _tmain(int argc, _TCHAR* argv[])
{// Loads the specified module into the address space of the calling process.
HINSTANCE hDLL = LoadLibrary(TEXT("C:\\sum_dll.dll"));
if(hDLL == NULL){
cout << "error" << endl; // error check
}

//Retrieves the address of an exported function or variable from the specified dynamic-link library (DLL).
FARPROC lpIO = GetProcAddress(HMODULE(hDLL),"Sum_dll");

//define type
FUNC myFunc;
myFunc = FUNC(lpIO);

//define returned variable
int32_t myValue;

//call function
myFunc(2,3,&myValue);

cout << myValue << endl;

FreeLibrary(hDLL);
return 0;
}
0

Это не работало, пока я не включил файл .lib в свойства проекта -> linker-> Input-> Delay Loaded Dlls

0
По вопросам рекламы [email protected]