Поместите несколько значений в один атрибут структуры

Мне нужно поместить несколько значений в один атрибут структуры, атрибут, который будет принимать значения, является LPSTR, я пытался передать все это как вектор, скомпилировать, но это не работает так, как мне бы хотелось.

Моя структура:

typedef struct _wfs_pin_caps
{
WORD                wClass;
WORD                fwType;
............More...............
BOOL                bIDConnect;
WORD                fwIDKey;
WORD                fwValidationAlgorithms;
WORD                fwKeyCheckModes;
LPSTR               lpszExtra; //This attribute must receive more than one value
} WFSPINCAPS, * LPWFSPINCAPS;

Как я пытаюсь сделать:

HRESULT WINAPI WFPGetInfo(HSERVICE hService, DWORD dwCategory, LPVOID   lpQueryDetails, DWORD dwTimeOut, HWND hWnd, REQUESTID ReqID) {

...

result = WFMAllocateMore(sizeof(WFSPINCAPS), lpWFSResult, &lpWFSResult->lpBuffer);

...

//This Values
vector<LPSTR> Tokens;
Tokens[1] = (LPSTR)"Value1";
Tokens[2] = (LPSTR)"Value2";
Tokens[3] = (LPSTR)"Value4";
Tokens[4] = (LPSTR)"Value5";

PinCapabilities.lpszExtra = (LPSTR)&Tokens; //Pass HERE

memcpy(lpWFSResult->lpBuffer,&PinCapabilities,sizeof(WFSPINCAPS));

...
return WFS_SUCCESS;

-1

Решение

Ваш вопрос очень неясен, но если я понимаю, проблема в том, что вы задаете lpszExtra на локальный вектор Tokens (хранится в стеке), и это будет уничтожено в конце этой функции.

Одним из способов было бы создать вектор в куче следующим образом:

// Create a new vector in the heap of 5 elements (0..4)
vector<LPSTR> &Tokens = *new vector<LPSTR>(5);
Tokens[1] = (LPSTR) "Value1";
Tokens[2] = (LPSTR) "Value2";
Tokens[3] = (LPSTR) "Value4";
Tokens[4] = (LPSTR) "Value5";

PinCapabilities.lpszExtra = (LPSTR) &Tokens; //Pass HERE

// Assuming that lpBuffer has room for a WFSPINCAPS structure
memcpy(lpWFSResult->lpBuffer, &PinCapabilities, sizeof(WFSPINCAPS));

Теперь ((LPWFSPINCAPS)lpWFSResult->lpBuffer)->lpszExtra содержит действительный указатель на vector это может быть использовано в любой другой функции, например:

LPWFSPINCAPS pPinCapabilities = (LPWFSPINCAPS) lpWFSResult->lpBuffer;
vector<LPSTR> &Tokens = *(vector<LPSTR> *) pPinCapabilities->lpszExtra;
LPSTR str = Tokens[3]; // Will get "Value4"

Но не забывайте, что в какой-то момент вам придется освободить память вектора:

LPWFSPINCAPS pPinCapabilities2 = (LPWFSPINCAPS) lpWFSResult->lpBuffer;
delete (vector<LPSTR> *) pPinCapabilities2->lpszExtra;

И, пожалуйста, в следующий раз попробуйте создайте минимальный, полный и проверяемый пример чтобы помочь нам, чтобы помочь вам.

0

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

Других решений пока нет …