chillichong Ответов: 2

C++ вложенная структура с массивом


я передал вложенную структуру в функцию dll,
он возвращает "нарушение доступа из функции dll.

Есть ли у моего кода какие-либо проблемы ?
Огромное спасибо

Что я уже пробовал:

#define CM24_NUMDEPCASSETTE			24

typedef struct SNOTETYPE
{
	char Notetype[6];
	int NumNote;
}SNOTE;

struct SWITH
{
	int OutNumber;
	SNOTE Types[CM24_NUMDEPCASSETTE * 4]; 
};

// Here is the function, i use LoadLibrary
typedef int (WINAPI*FNPTR) (SWITH RequestBankNot, SWITH WithdrawData);


FNPTR fnWithdraw = (FNPTR)GetProcAddress(Hinst, "InterDoWithdrawall");
if (fnWithdraw)
{
	SWITH vWithdrawall, vWithdrallData;
	vWithdrawall.OutNumber = 0;
	vWithdrawall.Types.NumNote = 1;
	strncpy_s(vWithdrawall.Types.Notetype, sizeof(vWithdrawall.Types.Notetype), "CPEA", sizeof(SNOTETYPE::Notetype));

	vWithdrallData.OutNumber = 0;
	vWithdrallData.Types.NumNote = 0;
	
       
	int Result = fnWithdraw(vWithdrawall, vWithdrallData); // here it prompt me error message
	std::cout << "\nResult:\n", Result;
}

CPallini

Вы не отправили сообщение InterDoWithdrawall код функции.

2 Ответов

Рейтинг:
0

Richard MacCutchan

Этот код не будет компилироваться.

vWithdrawall.Types.NumNote = 1;

// Types is an array so needs an array index to be addressed correctly
//


chillichong

код будет выглядеть примерно так: "vWithdrawall.Типы[0].NumNote = 1;"

Должен ли я заполнить весь массив, а затем отправить в функцию, или я просто отправлю в функцию 1 строку данных?

Спасибо

Richard MacCutchan

Как мы можем знать, что вы должны послать? Посмотрите документацию по DLL или спросите людей, которые ее написали.

chillichong

я что-то изменил в своем коде, но он все равно выдает ту же ошибку.
Пожалуйста, дайте мне несколько советов, Спасибо


#определение CM24_NUMDEPCASSETTE 24

typedef struct SNOTETYPE
{
char Notetype[6];
инт NumNote;
}Обратите внимание,;

typedef struct SWITH
{
инт больше, чем;
Типы SNOTE[CM24_NUMDEPCASSETTE * 4]; //[CM24_NUMDEPCASSETTE * 4]
}SWITHDRAWALL;
typedef SWITHDRAWALL *PASWITHDRAWALLCASS;

typedef int (WINAPI*FNPTR) (SWITHDRAWALL RequestBankNot, SWITHDRAWALL WithdrawData);

FNPTR fnWithdraw = (FNPTR)GetProcAddress(Hinst, "InterDoWithdrawall");
если (fnWithdraw)
{
struct SWITH *ptrWithdrawall, stWithdrawall;
struct SWITH *ptrWithdrawdata, stWithdrawdata;

ptrWithdrawall = &stWithdrawall;
стуитдраволл.OutNumber = 0;
стуитдраволл.Типы[0].NumNote = 1;
strncpy_s(stWithdrawall.Типы[0].Notetype, sizeof(stWithdrawall.Типы[0].Notetype), "CPEA", sizeof(SNOTETYPE::Notetype));

ptrWithdrawdata = &stWithdrawdata;
стуитдраволл.OutNumber = 0;
стуитдраволл.Типы[0].NumNote = 0;
strncpy_s(stWithdrawall.Типы[0].Notetype, sizeof(stWithdrawall.Типы[0].Notetype), "", sizeof(SNOTETYPE::Notetype));

int Result = fnWithdraw(stWithdrawall, stWithdrawdata);
std::cout << "\nResult:\n", результат;

Richard MacCutchan

Смотреть ниже.

Рейтинг:
0

Richard MacCutchan

int Result = fnWithdraw(stWithdrawall, stWithdrawdata);

Вы передаете полные структуры в свою функцию dll вместо указателей. Это должно было быть показано компилятором.
Правильный код (я предполагаю) должен быть:
int Result = fnWithdraw(ptrWithdrawall, ptrWithdrawdata);