Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hi

Ich wüsste mal gerne wie man an eine laufende EXE nen parameter übergeben kann.

Bis jetzt hab ichs mit nem Key in der Reg realisiert aber ich glaub net das dass fürs system so gesund is wenn ich jede sekunde nen key lese.

Hoffentlich kann mir jemand helfen :(

Gruß

|ReDBullet|

Geschrieben

Ähm, wie meinst Du das? Soll es beim Aufruf geschehen?

Z.B. "programm.exe /parameter1 /parameter2"

Bitte schilder mal das Problem genauer.

Geschrieben

Parameter? Von wo? Eintrag aus einer INI-Datei? Benutzereingabe? Daten aus einem anderen Programm?

Geschrieben

Wenn du etwas an das Programm übergeben möchtest, während es läuft, ist das ja kein Parameter mehr. Das heisst dann anders. Da ich allerdings nicht weiß, was du meinst, kann ich dir nicht sagen, wie es heisst. Beschreib mal genau, was du z.B. übergeben möchtest und an welcher Stelle.

Du sagtest was von einem Registry Key, den du alle paar Sekunden ausliest. Meinst du vielleicht eine globale Variable, die man von überall aus aufrufen kann?

Geschrieben

ja globale variable klingt net schlecht

also noch genauer:

ich bau an nem mp3 player und der soll wenn ich nochmal auf ne mp3-file click diese file adden (sodass das lied was vorher drin war auch drin bleibt).

da das prog neu gestartet wird wenn ich auf ne mp3-file click hab ich in die main sub (die auch als erstes im programm gestartet wird) ne abfrage reingemacht ob der player schon läuft wenn das prog schon läuft schreibt er das lied das er per command bekommen hat in die reg als key und das programm das schon läuft liest wie gesagt immer wieder die reg und wenn was neues drin steht added er das und das wollte ich halt irgendwie umgehen.

k?

gruß

|ReDBullet|

Geschrieben

Ok, die Registry kannst Du mir einem Eintrag in einer INI-Datei umgehen. Ansonsten musst Du für Deinen MP3Player nur eine Instanz zulassen.

Geschrieben

mh naja eigentlich lass ich ja nur eine instanz zu mit:

Option Explicit

Sub Main()

Dim MemTitle$

If App.PrevInstance = True Then

End

Else

Form1.Show

End If

End Sub

und ne ini-file müsste ich ja auch immer wieder lesen und ich glaub das das noch mehr zu lasten der performance wäre :(

Geschrieben

Da ich zu VB selbst nicht viel sagen kann wollt ich hier anderen den Vortritt lassen, aber wenn keiner will ;)

Jede Exe läuft in einem eigenen Prozess, diese Prozesse haben je einen zugeteilten Speicherbereich, auf den nur sie zugreifen können. Das ist eine Schutzvorrichtung um z.B. nicht einfach irgendwelche Passwörter o.ä. aus einem anderen Programm klauen zu können (das geht zwar trotzdem wenn man will, aber nicht so einfach). Auch wird damit verhindert, das ein Programm aus versehen die Daten eines anderen überschreibt und es zu einem Absturz oder Datenverölust o.ä. kommen kann.

Es ist also nicht möglich, in den Bereich eines anderen Programms zu schreiben.

Soweit erstmal zur theorie. Aber natürlich kennst du aber ähnliches von anderen Programmen. Und es gilt: Wenn andere Programme es können kannst du es (theoretisch) auch.

Ich hab nur eine kurze Erklärung zur Vorgehensweise. Das Beispiel dazu bzw. der Code ist aber nciht für VB deswegen spar ich mir das hier. Es sollte zumindest mal ein Hinweis sein, wonach du suchen musst.

Mit der Windows-Nachricht WM_COPYDATA ist es unter 32 Bit-Windows möglich,

Daten verschiedenster Natur zwischen unterschiedlichen Prozessen auszutauschen.

Eine Windows-interne Funktionalität ermöglicht bei Verwendung von WM_COPYDATA die Nutzung

eines gemeinsamen Speicherbereichs über eine Datenstruktur COPYDATASTRUCT,

die wie folgt aussieht:

}

type

TCopyDataStruct = packed record

dwData: DWORD; // anwendungsspezifischer Wert

cbData: DWORD; // Byte-Länge der zu übertragenden Daten

lpData: Pointer; // Adresse der Daten

end;

{

Dabei geschieht der Datenaustausch auf folgende Weise

(Zitat aus J. Richter, "Windows Programmierung für Experten",

Microsoft Press 1997, S. 524):

"Beim Senden einer Meldung des Typs WM_COPYDATA reserviert die Funktion SendMessage

einen Speicherbereich der angegebenen Größe (cbData Bytes) und kopiert die Daten

vom Adreßraum ihres Prozesses in eben diesen Speicherbereich. Danach sendet SendMessage

die Meldung an das ausgewählte Fenster. Wenn schließlich die empfangende Fensterprozedur

mit der Bearbeitung der Meldung beginnt, verweist der Parameter lParam auf eine

COPYDATASTRUCT-Struktur im Adreßraum des empfangenden Prozesses.

Die lpData-Komponente der Struktur verweist auf den gemeinsamen

Speicherbereich, dessen Adresse jedoch an den Adreßraum des

empfangenden Prozesses angepaßt worden ist.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...