Was macht die Zeile (*StrProc) (szText) ; ??
-
Hallo Zusammen,
vielleicht kann mir Jemand ja helfen. Ich suche die Bedeutung der oben genannten Zeile in folgendem Programm. Ziel ist es eine DLL aufzurufen und einen String zurück zu erhalten.
Würde mich freuen, wenn ich an der Ecke weiterkommen würde. Vielen Dank vorab.
Viele Grüsse
Oliver
[cpp] #include <windows.h> long FAR WINAPI WndProc (HWND, WORD, WORD, LONG) ; FARPROC StrProc ; // COBOL function HANDLE hlib ; // library handle int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow) { static char szAppName[] = "HelloWin" ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; if (!hPrevInstance) { wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = (WNDPROC)WndProc; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor(NULL, IDC_ARROW) ; wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; RegisterClass (&wndclass) ; } hwnd = CreateWindow (szAppName, "C and COBOL DLL demo", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, nCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } long FAR WINAPI WndProc (HWND hwnd, WORD message, WORD wParam, LONG lParam) { HDC hdc ; PAINTSTRUCT ps ; RECT rect ; char szText[255]; switch (message) { case WM_CREATE : hlib = LoadLibrary ("WINDLL.DLL") ; return 0 ; case WM_PAINT : // call COBOL to get strings to display hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; rect.bottom = rect.bottom / 3 ; StrProc = GetProcAddress (hlib, "GETSTR1") ; (*StrProc) (szText) ; DrawText (hdc, szText, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_BOTTOM) ; rect.bottom = rect.bottom * 2 ; StrProc = GetProcAddress (hlib, "GETSTR2") ; [b](*StrProc) (szText) ; [/b] DrawText (hdc, szText, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_BOTTOM) ; EndPaint (hwnd, &ps) ; return 0 ; case WM_DESTROY FreeLibrary (hlib) ; PostQuitMessage (0) ; return 0 ; } return DefWindowProc (hwnd, message, wParam, lParam) ; }[/cpp]
-
StrProc(szText);
-
StrProc ist ein Zeiger auf eine Funktion.
StrProc = GetProcAddress (hlib, "GETSTR1") ;der Zeiger wird auf eine aus einer DLL entnommenen Funktion namens GETSTR1 gesetzt. Mit (*StrProc)(szText) wird dieser Zeiger dann dereferenziert und die dahinterliegende Funktion aufgerufen. Das kann man übrigens auch einfacher haben, indem man
StrProc(szText)schreibt.
-
du solltest vielleicht mal
FARPROC StrProc ;
in einen vernünftigen funktionszeiger umwandeln.
mit FARPROC kann man nichts anfangen. wundert mich das dein beispiel geht
-
Hallo Zusammen,
Danke für die Antworten. Also: Mein Beispiel geht gar nicht und mich wundert dann auch nicht mehr warum nicht. Das Beispiel stammt aus dem Netz und ist ein Sample der Firma MicroFocus. Ich werde Eure Tips mal umsetzen und versuche es dann noch einmal. Also ein Funktionszeiger ist das hier ... Na, da bin ich gespannt.
Viele Grüsse
Oliver