dll Programmieren



  • Hallo Forum!

    Ich habe ein kleines Problem:

    Ich habe ein Beispielsource einer dll gefunden. Nach der kompilierung kam, wen wunderts, eine dll zu stande.

    Aus einem VB-Beispielprogramm, kann ich nun sämtliche Funktionen die in dem Beispiel bereits integriert waren, aufrufen. Die einzigste Funktion die ich nicht aufrufen kann, ist die von mir eigens hinzugefügte.

    Ich bekomme im VB eine Meldung:
    Can´t find DLL entry point CaptureScreen in test_dll.dll

    Gibt es etwas was ich beachten muss?
    Normalerweise müsste doch wenn ich in der selben Form der vorgegebenen Beispielfunktionen eine hinzufüge doch kennen...

    Ich bin für jeden Tipp dankbar!

    Bel

    P.S.
    Wenn der Beitrag im falschen Forum ist, tut es mir leid. Allerdings wüsste ich nicht wohin ich das Problem sonst schreiben sollte. Die anderen Foren passen noch weniger.



  • funktionen, die du von extern aufrufen willst, musst du auch als extern deklarieren!
    zeig mal wenig code!



  • So siehts derzeit aus:

    BOOL    _stdcall CaptureScreen   (bool input);
    signed long  _stdcall StdVar_Byte    (unsigned char     ByValValue,    unsigned char    *ByRefValue);
    
    BOOL WINAPI DllEntryPoint ( HINSTANCE hDLL, DWORD dwREASON, LPVOID Reserved )
    {
        switch (dwREASON)
        { 
            case DLL_PROCESS_ATTACH: {
                                        break; 
                                     }
    
            case DLL_PROCESS_DETACH: {
                                        break; 
                                     }       
        }
        return TRUE;
    }
    
    ////////////////////////////////////////////////////////////////////
    // Hier bitte mehrere Testfunktionen rein denken, die funktionieren
    // ein bsp.
    ////////////////////////////////////////////////////////////////////
    
    //------------------------------------------------------------------------
    
    signed long _stdcall StdVar_Byte (unsigned char ByValValue, char *ByRefValue)
    {
        ByValValue++;
        *ByRefValue = *ByRefValue + 2;
        return (ByValValue);
    }
    
    //------------------------------------------------------------------------
    
    BOOL _stdcall CaptureScreen (bool input)
    {
    
        HDC hDC;
        PictureBox *pbox;
    
        hDC = GetDC(NULL); //Get full screen
    
        HDC hMemDC = CreateCompatibleDC(hDC);
    
        SIZE size;
    
        size.cx = GetSystemMetrics(SM_CXSCREEN);
    
        size.cy = GetSystemMetrics(SM_CYSCREEN);
        {
            size.cx = r.right-r.left;
            size.cy = r.bottom-r.top;
        }
    
        HBITMAP hBitmap = CreateCompatibleBitmap(hDC, size.cx, size.cy);
    
        pbox->Image->Save("C:\\Z.Jpg", Drawing::Imaging::ImageFormat::Jpeg);
    
        if (hBitmap)
        {
            HBITMAP hOld = (HBITMAP) SelectObject(hMemDC, hBitmap);
            BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, SRCCOPY);
            SelectObject(hMemDC, hOld);
            DeleteDC(hMemDC);
            ReleaseDC(NULL, hDC);
            DeleteObject(hBitmap);
        }
        return TRUE;
    
    }
    

    Soviel zum C Code

    Im VB siehts so aus:

    Private Declare Function StdVar_Byte Lib "test_dll.dll" _
           (ByVal ByValValue As Byte, ByRef ByRefValue As Byte) As Long
    
    Private Declare Function CaptureScreen Lib "test_dll.dll" _
           (ByVal ByValBool) As Boolean
    
    StdVar_ByValByte = StdVar_Byte(StdVar_ByValByte, StdVar_ByRefByte)
    

    funktioniert einwandfrei

    returnvalue = CaptureScreen(False)
    

    aber leider nicht.



  • Ok, da steht die Funktion. Aber wird diese auch exportiert? Ich rate mal, daß bei diesem Projekt noch ein Def-File dabei ist. Hier mußt Du Deine Funktion dem EXPORTS-Abschnitt hinzufügen.

    BTW: Das direkt Gegenstück zum Basic-Typ 'Boolean' ist nicht 'BOOL', sondern 'VARIANT_BOOL'. Außerdem darfst Du nicht einfach 'TRUE' zurückgeben, VB erwartet hier -1. AFAIK und IIRC.

    [ Dieser Beitrag wurde am 09.01.2003 um 14:45 Uhr von -King- editiert. ]



  • Ihr hattet recht.
    In der .def datei Standen natürlich alle Beispielfunktionen nur meine nicht. 🙄

    ok...
    Eingebaut...

    Jetz sagt er mir:
    Screenydll fatal error LNK1561: Einstiegspunkt muss definiert sein

    Er hat doch nen DllEntryPoint 😕

    Übrigens hab ich das BOOL wieder durch void ersetzt, war nur testweise reingerutscht.



  • Benenne 'DllEntryPoint' mal um in 'DllMain'.



  • selber fehler



  • Ich arbeite mit der .NET Entwicklungsumgebung.
    Nach ein bisschen rumfrickeln, ist mir folgendes aufgefallen:

    Ich kann unter den Projekteigenschaften den Konfigurationstypen festlegen.
    Dieser stand auf .exe und hat mir (mit den Beispielfunktionen) eine .dll erzeugt. Ich habe die Einstellung mal auf .dll gestellt. Der Fehler ist weg, allerdings erzeugt die Umgebung mir nun eine .exe 😕

    Vielleicht bringt euch das ja auf eine Spur.


Anmelden zum Antworten