Frage zur Speicherzuweisung ...



  • Hallo,

    wenn ich einen Pointer erzeuge, hat dieser z.B. die Adresse
    0x0012fd68 gespeichert. Wird diese Adressenangabe nun auf den
    gesamten Speicher von Windows bezogen, oder nur auf einen Bruchteil,
    der dem Programm zugewiesen wurde ?

    Wenn zweiteres:
    Wie übergebe ich dann einen Pointer von einer DLL ins Hauptprogramm ?
    Da müsste der Adresswert ja irgendwohin zeigen ? und nicht auf den richtigen
    Wert ...



  • thenoname schrieb:

    wenn ich einen Pointer erzeuge, hat dieser z.B. die Adresse
    0x0012fd68 gespeichert. Wird diese Adressenangabe nun auf den
    gesamten Speicher von Windows bezogen, oder nur auf einen Bruchteil,
    der dem Programm zugewiesen wurde ?

    Der Zeiger zeigt auf den "Bruchteil", den Windows dir zugeteilt hat. Dieser "Bruchteil" kann aber bis zu 2GB (manchmal auch 3GB) groß werden.

    Wenn zweiteres:
    Wie übergebe ich dann einen Pointer von einer DLL ins Hauptprogramm ?
    Da müsste der Adresswert ja irgendwohin zeigen ? und nicht auf den richtigen
    Wert ...

    Das wurde von Windows bereits gelöst. Die DLL landet im selben Adressbereich wie die exe, deswegen sind Pointer austauschbar.
    Anders sieht es aus, wenn du mit SendMessage o.ä. einem anderen Programm einen Pointer schickst. Dann erhält das Programm meist einen ungültigen Zeiger.



  • nun habe ich folgendes Problem:
    ein Pointer auf DWORD funktioniert
    ein Pointer auf ein DWORD array [3]
    ergibt nach der Übergabe wirre Zuordnungen ? und andere Werte.

    In der DLL selbst läuft die Abfrage der Werte reibungslos.



  • Aber der Speicherbereich wird nicht lokal reserviert, sondern ist zum Zeitpunkt des Zugriffs aus der DLL noch gültig?! Evtl. hilft auch ein wenig Code 🙂



  • Zwar habe ich schon unter Spiele diesen Code stehen, trotzdem nochmal hier:

    DLL:

    zum sharen der Struktur: (DIEFFECT ist eine Struktur aus DirectInput)
    
    #pragma bss_seg ("shared")   //bss_seg für nicht initiallisierte Variablen
    DIEFFECT diEffect;
    #pragma bss_seg()
    #pragma comment(linker,"/SECTION:shared,RWS")
    
    weiter unten:
    
    	ZeroMemory( &diEffect, sizeof(diEffect) );
    	DWORD Axes[2] = { DIJOFS_X, DIJOFS_Y };
    	LONG Direction[2] = { 90 * DI_DEGREES, 90 * DI_DEGREES };
    	diConstant.lMagnitude			= DI_FFNOMINALMAX;
    	diEffect.dwSize					= sizeof(DIEFFECT);
    	diEffect.dwFlags				= DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
    	diEffect.dwDuration				= (DWORD)(2 * DI_SECONDS);
    	diEffect.dwGain					= DI_FFNOMINALMAX;
    	diEffect.rglDirection			= Direction;
    	diEffect.dwTriggerButton		= DIEB_NOTRIGGER;
    	diEffect.dwTriggerRepeatInterval= 0;
    	diEffect.cAxes					= 2;
    	diEffect.rgdwAxes				= Axes;
    	diEffect.cbTypeSpecificParams	= sizeof(DICONSTANTFORCE);
    	diEffect.lpvTypeSpecificParams	= &diConstant;
    
    (an dieser Stelle lassen sich diEffect.rgdwAxes und diEffect.rglDirection abfragen)
    
    Dann Übergaberoutine in DLL:
    
    DIEFFECT getEffect (void)
    {
        return diEffect;
    }
    

    DIJOFS_X ist 0 und DIJOFS_Y ist 4 als Offset.

    Ich lasse mir nun im Hauptprogramm die Struktur im Debugger anzeigen und statt
    der 0 auf die der Pointer noch in der DLL zeigt stehen dort andere Werte,
    die sich auch noch abwechseln. Dementsprechen nimmt die Auslesevariable natürlich
    diesen wirren Wert an.
    Alle anderen Pointer der Struktur funktionieren Tadellos !!!

    Ich könnt jetzt natürlich eine Routine speziell zum auslesen der Pointer
    schreiben, die vorher in der DLL richtig gelesen werden. Dies ist aber
    irgendwie nicht so mein Stil ...



  • thenoname schrieb:

    zum sharen der Struktur: (DIEFFECT ist eine Struktur aus DirectInput)
    
    #pragma bss_seg ("shared")   //bss_seg für nicht initiallisierte Variablen
    DIEFFECT diEffect;
    #pragma bss_seg()
    #pragma comment(linker,"/SECTION:shared,RWS")
    

    Es ist nicht nötig die Variable in ein extra Segment zu stecken.
    Das brauchst du nur, wenn du erreichen willst, dass auf diEffect von verschiedenen Programmen zugegriffen werden kann. In deinem Fall könnte das shared-segment Fehler verursachen.



  • ja, ich greife von verschiedenen Programmen darauf zu.



  • Wenn du DWORD Axes[2] deklarierst und dann in diEffect.rgdwAxes Axes angibst, so gibst du (im Gegensatz zur Deklaration als DWORD Axes) nur einen Pointer auf DWORD an. Da Axes aber nicht im shared-Memory Bereich liegt, kannst du nachher auch nicht mehr darauf zugreifen. Also einfach DWORD Axes[2] = {0} in den shared-Bereich 🙂


Anmelden zum Antworten