2014-10-19 3 views
0

HWND와 DC가 구조체의 벡터에 포함 된 다중 인스턴스 대화 상자가 있습니다. CreateWindowEx()을 호출하기 전에 구조체의 새 인스턴스에 메모리를 할당하고 포인터를 WndProc에 전달합니다 (lpParam). 나는 다음과 같은 코드를 가지고있는 WndProc을 내부 포인터로 구조체 멤버에 액세스

:

HexParams Hex; 
HexParams *pHex; 
if (uMsg == WM_NCCREATE) { 
    SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR) ((CREATESTRUCT *)lParam)->lpCreateParams); 
    return TRUE; 
} else { 
    LONG_PTR lpUserData = GetWindowLongPtr(hDlg, GWLP_USERDATA); 
    if (lpUserData) { 
     pHex = (HexParams *)lpUserData; 
     Hex = *pHex; 
    } else 
     return DefWindowProc(hDlg, uMsg, wParam, lParam); 
} 

그럼 난 끊임없이 memebrs을 액세서하는 Hex.Member를 사용하고 전체의 WndProc을 통해, 그들로부터 읽고 (그들에게 쓰는 것은 때를에서 왼쪽 된 경우 단일 인스턴스이고 구조체는 전역 적입니다.) 그래서 다중 인스턴스 지원을 추가 할 때 포인터를 간단히 참조 해제하면 해당 벡터의 구조체 memebr을 얻을 수 있기를 바랍니다. 그 전에 Hex = *pHex; 일에도 불구하고

Hex.DC = GetDC(hDlg); 
pHex->DC = GetDC(hDlg); 

:

그러나, 다음의 예는 다른 일을. pHex->DC 내 벡터 요소에 씁니다, 그러나 Hex.DC 어딘가에 내가 알아낼 수 없다 씁니다. 코드에서 Hex.Member 사용을 보존 할 방법이 있습니까? 아니면 모두를 pHex->Member으로 변환해야합니까?

"포인터가 누락되었습니다."그러나 제대로 사용하는 방법을 알 수 없습니다.

+0

'Hex'는'* pHex'의 ** copy **입니다. ** 포인터는 참조가 아닙니다 ** ** –

답변

2

Hex은 그 기능에서 정의 된 변수입니다. Hex.DC을 쓰면이 함수 호출 스택에서 해당 구조 내의 4 바이트를 참조합니다.

pHex 포인트는 발신자에 의해 결정됩니다. Hex = *pHex;은 도착하는 구조의 내용을 로컬 구조로 복사합니다. 그들은 서로 다른 기억의 블록입니다.

스택 사진을 그려 통화의 활성화 프레임을 차단하고 16 진수로 채 웁니다. 메모리가 할당 된 다른 블록 (전역, 동적, 이전 호출)을 그려서 화살표를 그려 포인터를 나타냅니다.

+0

어떻게 든'.'을 사용할 때 초기 구조에 접근 할 수 있습니까? – feos

+0

나는 따라 가지 않는다. 원래 구조체 인스턴스가있는 경우,'.'을 사용하여 필드를 가져옵니다. –

+0

대화 상자 Proc는 지정된 대화 상자 인스턴스에 대해 액세스해야하는 벡터 요소를 알지 못합니다. 그래서 적절한 벡터 요소에 대한 포인터를 전달합니다. 즉, 대화 상자 복사본에 해당하는 구조체 인스턴스에 사용할 변수를 지정합니다. 어쨌든, 나는 이미 모든 코드를 내 코드의 화살표로 바꿨다. – feos

관련 문제