![]() |
Gibt es sowas auch für den Delphi-Compiler?
Liste der Anhänge anzeigen (Anzahl: 1)
Code:
Das weißt den VC-Compiler an Die angegeben Variablen in einem eigenen Abschnitt names "Sahred" unterzubrigen. Dann dem Linker mitteilen, dass die Dten in diesem Anbschnitt von allen Instanzen dieser Anwendung gemeinsam verwendet werden sollen.
#pragma (data_seg("Sahred")
HHOOK g_hHook = NULL; DWORD g_dwThreadIDDips = 0; #pragma data_seg() // Den Linker anweisen, den Abschnitt Shared lesbar // und beschreibbar zu machen #pragma comment(linker, /"section:Shared,rws") @Christina Seehase: Du hast ja auch den Richter. Ich versuche gerade die Anwendung DIPS in Delphi zu schreiben. Aber ich bekomme immer eine Acces-Violation. Wenn du dir das mal ankucken könntest. Ich finde den Fehler einfach nicht. |
Moin Luckie,
bei mir fliegt er immer bei DipsSet(0) auf die Nase. Und soweit ich das sehe entspricht auch die Übersetzung der SetDipsHook Funktion in der DLL der Vorgabe (abgesehen vom ShowMessage) Tritt der Fehler auch auf, wenn ShowMessage weggelassen wird? Was ich übrigens grundsätzlich anders mache bei der Deklaration solcher Funktionen (z.B. auch API Übersetzungen): Bei mir werden sämtliche Parameter als const deklariert. I.d.R. wird bei den Funktionen ja entweder der Wert der übergeben wurde direkt benutzt (z.B. Typ DWORD), oder es ist ein Pointer auf einen Speicherbereich (z.B. PDWORD). Eventuell klappt da was nicht mit der Art, wie Delphi die Parameter ohne const übergibt? |
Ja, bei mir auch. Aber "auf die Nase fliegen" ist manchmal noch etwas untertrieben. Ich habe da bisher noch keine Lösung gefunden.
|
Anscheinend brauch man das nicht. Also die Einstellung für das VC für die DLL.
Zur Erklärung: Ich will die Positionen der Icons auf dem Desktop sichern. dazu muß ich eine DLL in den Adressraum des Explorers injezieren, der für den Desktop verantwortlich ist. das ist nicht ganz einfach - eben eine Herausforderung. Aber wenn sich auch noch mal anderen dem Problem annehmen könnte: Die DLL verursacht immer eine schöne Access-Violation. Und ich konnte bisher noch nicht rausfinden warum. Aber Achtung, der Fehler kann eur ganzes System zerschießen. Unter Win2000 reicht aber ein Ab- und wieder Anmelden, dann kann man weiterarbeiten. Es kann euch deswegen das ganze System zerschießen, weil ich die DLL per Hook in den Explorer-Prozess injeziere, der für den Desktop verantwortlich ist. Ich denke, wenn das Problem mit der Access-Violation gelöst ist, dann ist der Rest meines Vorhabens nur noch ein Klacks. Nachtrag: Die DLL muß sich dann im Windows-System-ordner befinden. |
Was mit aufgefallen ist:
Delphi-Quellcode:
Läuft ja noch in deinem Programm ab. Wenn du nun aber in GetMsgProc auf g_dwThreadIDDips zugreifst, dann enthält diese Variable nicht den zuvor zugewiesenen Inhalt, da sie nicht in einem shared Datensegment liegt. (Solche Datensegmente lassen sich mit Delphi nicht erzeugen)
g_dwThreadIDDips := GetCurrentThreadID();
Eine Möglichkeit wäre die Verwendung von MMF, die z.B. im Pagefile (Swap-Datei) liegen. |
Deswegen wohl auch die Compiler- und Linker-Schalter im VC. Aber es muß gehen. Nico hat es auch geschaft ohne MMF.
Hier noch mal die Erklärung, was das eigentlich soll: ![]() |
Ein shared segment laesst sich mit Delphi nicht erstellen.
Auf der Borland Community gibt es aber ein Tool von Petr Vones mit der man ein shared segment an eine DLL antackern kann. Es wird eine globale Variable der Delphi DLL umgewandelt. |
Danke, werde mich mal da informieren. Einen direkten Link hast du nicht zufällig parat oder einen Link in die Nähe oder so?
|
Wer suchet, der
![]() |
Spitze, danke. :P
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz