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


Anmelden zum Antworten