2017-03-04 5 views
-1

構造体の単一の属性に複数の値を入れる必要があります。値を受け取る属性はLPSTRです。これをすべてベクトル、コンパイル、それは私が望むように動作しません。構造体の単一の属性に複数の値を入れる

私のstruct:

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

ありがとうと申し訳ありません:( –

関連する問題