2016-04-07 12 views
0

Ich schreibe eine kleine, dialogbasierte Win32-Anwendung. Ich muss ein zweites Dialogfeld erstellen und anzeigen, wenn auf eine Menüschaltfläche geklickt wird. Ich habe die HWND in einer externen Header-Datei deklariert - wedge.hDefinition von extern deklarierten Variablen funktioniert in einer Funktion, aber nicht in einem anderen

wedge.h

#pragma once 
#include <Windows.h> 
#include "utilities.h" 

extern HWND wedgedialog; 
INT_PTR CALLBACK WedgeProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); 

Wenn ich versuche und wedgedialog in meiner WinMain-Funktion definieren und die Variable in meiner DialogProc Funktion verwenden, ich einen "ungelösten externen Symbol" -Fehler vom Linker erhalten. Wenn ich Kedgedialog in meinem DialogProc definiere und verwende, funktioniert alles gut. Warum funktioniert die Definition in einer Funktion, aber nicht in der anderen? Denken Sie daran, meine WinMain- und DialogProc-Funktion befinden sich in derselben Datei.

main.cpp

INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); 
int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE h0, LPTSTR lpCmdLine, int nCmdShow) 
{ 
HWND hDlg; 
MSG msg; 
BOOL ret; 
InitCommonControls(); 
hDlg = CreateDialogParam(hInst, MAKEINTRESOURCE(MAIN), 0, DialogProc, 0); 


HWND wedgedialog = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(WEDGE), hDlg, WedgeProc); 


ShowWindow(hDlg, nCmdShow); 
HMENU menu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MENU1)); 
SetMenu(hDlg, menu); 
while ((ret = GetMessage(&msg, 0, 0, 0)) != 0) { 
    if (ret == -1) 
     return -1; 
    if (!IsDialogMessage(hDlg, &msg)) { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

} 
return 0; 
} 

INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
switch (uMsg) 
{ 

case WM_CLOSE: 
    DestroyWindow(hDlg); 
    return TRUE; 
    break; 
case WM_DESTROY: 
    PostQuitMessage(0); 
    return TRUE; 
    break; 
case WM_COMMAND: 
    switch (LOWORD(wParam)) 
    { 
    case ID_EDIT_WEDGESETTINGS: 

     ShowWindow(wedgedialog, SW_SHOW); 
     break; 
    } 
    return TRUE; 
    break; 
} 
return FALSE; 
} 

Antwort

1

Sie sind nicht wirklich eine globale Variable definieren. Sie deklarieren eine lokale Variable mit dem Namen Wedgeialog vom Typ HWND in der _tWinMain-Funktion. Diese lokale Variable wird nicht automatisch in eine globale Variable umgewandelt, nur weil Sie eine externe Deklaration haben. Die externe Deklaration sagt dem Compiler, dass es irgendwo eine globale Variable gibt, weshalb der Code in DialogProc kompiliert wird, aber es gibt wirklich keinen globalen Link.

Um diese Arbeit zu machen, müssen Sie tatsächlich eine globale Variable deklarieren, außerhalb jeder Funktion, etwa so:

HWND wedgedialog = NULL; 

Dann in der Hauptfunktion, entfernen Sie den HWND Spezifizierer am Anfang der Zeile mit der CreateDialog-Aufruf, so dass Sie dem globalen einfach zuweisen, einen lokalen nicht deklarieren.

Sie können die externe Deklaration in der Kopfzeile lassen, wenn Sie möchten, aber Sie brauchen es nicht wirklich, es sei denn, Sie verwenden diese globale in einer anderen Funktion. Obwohl es wohl bessere Designs gibt als die Verwendung eines globalen. Sie könnten eine Klasse mit einem statischen Member deklarieren, um zumindest den globalen Namespace zu vermeiden. Oder Sie könnten eine Klasse mit einer statischen Funktion haben, um ein Singleton-Objekt zurückzugeben.

0

"extern HWND wedgedialog;" Ordnet die Variable nicht wirklich zu. Es teilt dem Compiler lediglich mit, dass die Variable in einer anderen Datei zugewiesen wird und während der Verknüpfung aufgelöst wird. In einer Ihrer anderen Dateien muss es sein:

"HWND wedgedialog;"

Um die Variable tatsächlich im Speicher zuzuweisen.

Verwandte Themen