Dll globale Variable verschwindet bei "Focusverlust" des Fensters



  • #pragma data_seg("SensHook")
    tSensivityBar* Bar;
    bool isCtrlDown;//, isShiftDown;
    #pragma data_seg()
    #pragma comment( linker ,"/section:Shared,RWS")
    

    Es funktioniert nicht und ich bekomme folgende Warnung:
    [C++ Warning] quellcode_new.cpp(12): W8094 Incorrect use of #pragma comment( <type> [,"string"] )



  • #pragma data_seg("SensHook")
    tSensivityBar* Bar;
    bool isCtrlDown;//, isShiftDown;
    #pragma data_seg()
    #pragma comment( linker ,"/section:Shared,RWS")
    
    #pragma data_seg("SensHook")
    tSensivityBar* Bar;
    bool isCtrlDown;//, isShiftDown;
    #pragma data_seg()
    #pragma comment( linker ,"/section:SensHook,RWS")
    

    geändert



  • Sry tripple Post:
    Geht aber immmer noch nicht.



  • Muss ich auch das HookHandle in das Data Segment schreiben?

    Es funktioniert nämlich immer noch nicht.



  • // Weise den Compiler an, die Variable hWindow in einem 
    // separaten Abschnitt namens Shared unterzubringen 
    // Darüber hinaus ist dann auch noch dem Linker mitzuteilen, 
    // dass die Daten in diesem Abschnitt von allen Instanzen 
    // dieser Anwendung gemeinsam verwendet werden sollen. 
    // Ganz wichtig dabei ist, dass die Variablen initialisiert 
    // sein müssen. 
    
    #pragma data_seg ("Shared") 
    HWND hWindow = 0 ; 
    #pragma data_seg () 
    
    // Weise den Compilern, den Abschnitt Shared als lesbar, 
    // beschreibbar und zur gemeinsamen Verwendung zu deklarieren - "RSW". 
    
    #pragma comment (linker, "/section:Shared,RWS")
    


  • Da mir ja sonst keiner glaubt:
    kompletter Quellcode einer Test-dll:

    //---------------------------------------------------------------------------
    
    #include <windows.h>
    #pragma hdrstop
    #pragma argsused
    
    #pragma data_seg(".SensHook")
    int testVar = 5;
    #pragma data_seg()
    #pragma comment(linker ,"/section:.SensHook,RWS")
    
    HINSTANCE hDllInstance ;
    HHOOK KeyHookHandle;
    
    int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved){
            hDllInstance = hinst;
            return 1;
    }
    LRESULT CALLBACK KeyHookProc(int nCode,WPARAM wParam,LPARAM lParam){
            if(nCode==HC_ACTION){
                    if(wParam == VK_CONTROL){
    
                            if((lParam & (1 << 31)) == 0){//Bedingung für WM_KEYDOWN
                                    if((lParam & (1 << 30)) == 0){//checkt ob Taste gedrückt gehalten wird
                                            if(testVar == 10){
                                                    Beep(500,100);
                                            }else{
                                                    if(testVar == 5){
                                                            Beep(1000,100);
                                                    }else{
                                                            Beep(1000,100);
                                                            Beep(500,100);
                                                    }
                                            }
                                    }
                            }
    
                    }
            }
            return(CallNextHookEx(KeyHookHandle, nCode, wParam, lParam));
    }
    //---------------------------------------------------------------------------
    __declspec (dllexport) bool InstallHook(void){
            testVar = 10;
            KeyHookHandle = NULL;
            KeyHookHandle = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyHookProc, hDllInstance,NULL);
            if (KeyHookHandle == NULL)
            {
                    return false;
            }else{
                    return true;
            }
    }
    //---------------------------------------------------------------------------
    __declspec (dllexport) int UninstallHook(void){
            if(UnhookWindowsHookEx(KeyHookHandle)){
                    return true;
            }else{
                    return false;
            }
    }
    

    Dieser Code macht folgendes:
    Im Data Segment ".SensHook" wird die Varible testVar angelegt. Die wird mit dem Wert 5 initialisiert. Beim Aufruf der Funktion InstallHook wird die Variable auf den Wert 10 geändert.
    Wenn ich nun die Funktion InstallHook aufrufe passiert folgendes:
    Wenn das Fenster, welches die Funktion aufgerufen hat, den Fokus hat und man die STRG - Taste drückt, hört man ein kurzes tiefes Piepen, was bedeutet das die Variable = 10 ist. Soweit stimmt alles.
    Wenn ich nun in ein anderes Fenster wechsle und wieder die STRG - Taste drücke, höre ich ein kurzes hohes Piepen, was bedeutet, das die Varible den Wert 5 hat. Ich schließe daraus, das sie den Wert hat, mit dem sie initialisiert wurde, unabhängig davon, dass sie eigentlich schon geändert wurde (beim Aufruf von InstallHook()).

    Woran liegt das?????



  • liegt an deinem komischen compiler der mit dem pragma statement nicht klarkommt. nimm mal vs, dann funzt es.



  • Das ist aber sehr komisch.
    Ich nutze den Borland C++ Builder 6 und hatte noch nie Probleme.

    Aber nun gut nehm ich halt Visual Studio



  • Reicht da die aktuelle Express Edition?



  • Die dll zu erstellen geht mit Visual C++ 2008 Express prima, allerdings weiß ich nicht, wie ich die dll jetzt laden soll.

    Ich habe in der Hauptanwendung folgendes reingeschrieben:

    // test3.cpp: Hauptprojektdatei.
    
    #include "stdafx.h"
    #include "Form1.h"
    //#pragma comment(lib, "test.lib")
    
    __declspec(dllimport) bool InstallHook(void) ;
    __declspec(dllimport) int UninstallHook() ;
    
    using namespace test3;
    
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
    	// Aktivieren visueller Effekte von Windows XP, bevor Steuerelemente erstellt werden
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
    
    	// Hauptfenster erstellen und ausführen
    	Application::Run(gcnew Form1());
    	InstallHook();
    	return 0;
    }
    

    So konnte ich die dll bei Borland C++ Builder laden.

    Ich bekomme allerdings diese Fehler:

    1>------ Erstellen gestartet: Projekt: test3, Konfiguration: Debug Win32 ------
    1>Kompilieren...
    1>test3.cpp
    1>.\test3.cpp(7) : warning C4272: "InstallHook": Ist als __declspec(dllimport) markiert. Beim Importieren einer Funktion muss eine systemeigene Aufrufkonvention angegeben werden.
    1>.\test3.cpp(8) : warning C4272: "UninstallHook": Ist als __declspec(dllimport) markiert. Beim Importieren einer Funktion muss eine systemeigene Aufrufkonvention angegeben werden.
    1>Verknüpfen...
    1>test3.obj : error LNK2028: Nicht aufgelöstes Token (0A000007) ""bool __clrcall InstallHook(void)" (?InstallHook@@$$FYM_NXZ)", auf das in Funktion ""int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z)" verwiesen wird.
    1>test3.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""bool __clrcall InstallHook(void)" (?InstallHook@@$$FYM_NXZ)" in Funktion ""int __clrcall main(cli::array<class System::String ^ >^)" (?main@@$$HYMHP$01AP$AAVString@System@@@Z)".
    1>C:\Dokumente und Einstellungen\Besitzer\Eigene Dateien\Visual Studio 2008\Projects\test3\Debug\test3.exe : fatal error LNK1120: 2 nicht aufgelöste externe Verweise.
    1>Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\Besitzer\Eigene Dateien\Visual Studio 2008\Projects\test3\test3\Debug\BuildLog.htm" gespeichert.
    1>test3 - 3 Fehler, 2 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
    



Anmelden zum Antworten