2017-03-04 4 views
-1

구조체의 단일 특성에 여러 값을 넣어야합니다. 값을받을 특성은 LPSTR이며,이 모든 것을 a로 전달하려고했습니다. 벡터, 컴파일,하지만 내가 원하는대로 작동하지 않습니다.구조체의 단일 특성에 여러 값 넣기

내 구조체 :

내가 할 노력하고있어으로
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; 
+0

코드를 적게 사용하여 문제를 재현 할 수 있습니까? – silentboy

+0

내가 질문 편집 –

+2

당신이 무엇을하려고하는지 명확하지 않지만 맨 위부터, 'sizeof (WFSPINCAPS)'는 컴파일 타임에 결정되는 상수라는 점에 유의하십시오. 마술처럼 증가하여 "Value1"등의 길이를 포함하지 않습니다. –

답변

0

귀하의 질문은 매우 명확하지 않다,하지만 난 그것을 이해한다면, 문제는 당신이 lpszExtra를 설정하는 것입니다 로컬 벡터 Tokens (스택에 저장 됨)은 해당 함수가 끝날 때 소멸됩니다.

LPWFSPINCAPS pPinCapabilities = (LPWFSPINCAPS) lpWFSResult->lpBuffer; 
vector<LPSTR> &Tokens = *(vector<LPSTR> *) pPinCapabilities->lpszExtra; 
LPSTR str = Tokens[3]; // Will get "Value4" 
: 지금 ((LPWFSPINCAPS)lpWFSResult->lpBuffer)->lpszExtra이 같은 다른 기능에서 사용할 수있는 vector에 대한 유효한 포인터를 포함

// 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 pPinCapabilities2 = (LPWFSPINCAPS) lpWFSResult->lpBuffer; 
delete (vector<LPSTR> *) pPinCapabilities2->lpszExtra; 

그리고 다음 번에 create a Minimal, Complete, and Verifiable example으로 연락하여 도움을 받으십시오.

+0

고맙고 미안 해요 :( –