tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
888
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    RELAX RELAX ist offline Mitglied
    Registriert seit
    Jan 2011
    Beiträge
    12
    Hallo Forum,
    ich hatte Probleme mir einen passenden "Titel" für dieses
    Thema auszudenken.

    Hier nochmal genau mein Problem(in Kurzform):
    Ich habe a.exe und brauche b.exe die
    a.exe "dropt" und dabei ein String (fest) mitgibt.

    Ich habe Probleme das zu erklären, falls jemand nicht genau weiß was ich meine
    kann ichs ja nochmal genauer erklären.

    Das einzige was ich bis Jetzt gefunden habe ist:
    @EDIT: Mein neuer Versuch nachzulesen in 1.Antwort

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    String textBox2 = @"123.exe";
                //App Domain
                AppDomain ad = AppDomain.CurrentDomain;
                //Assembly of EXE
                AssemblyName am = new AssemblyName();
                am.Name = "TestNAME";
                //Assembly maker
                AssemblyBuilder ab = ad.DefineDynamicAssembly(am, AssemblyBuilderAccess.Save);
                //Module maker
                ModuleBuilder mb = ab.DefineDynamicModule("MODULE", textBox2);
                //Type maker
                TypeBuilder tb = mb.DefineType("Type", TypeAttributes.Public);
                //Method Maker
                MethodBuilder metb = tb.DefineMethod("Main", MethodAttributes.Public |
                    MethodAttributes.Static, null, null);
                
                //Assembly maker entry Area
                ab.SetEntryPoint(metb);
     
                //MSIL Code Generator
                ILGenerator il = metb.GetILGenerator();
                //Create EXE
                il.EmitWriteLine("testbox1");
                il.Emit(OpCodes.Ret);
                tb.CreateType();
     
                //Save EXE
                ab.Save(textBox2);

    Allerdings macht der Code
    1. nicht das was ich will und
    2. ich versteh ihn viel zu wenig um daraus (vielleicht) etwas zu machen was ich will.

    Ich suche nach allen Möglichkeiten die es gibt einen String von b.exe dauerhaft an a.exe zu binden und in a.exe abfragen zu können. (da ich weiß das es mehrere Möglichkeiten gibt)

    danke im Voraus,
    RELAX
    Geändert von RELAX (18.09.11 um 07:48 Uhr) Grund: Andere Methode
     

  2. #2
    RELAX RELAX ist offline Mitglied
    Registriert seit
    Jan 2011
    Beiträge
    12
    Hallo,
    ich bin jetzt auf die Idee gekommen das Programm nicht zu "erstellen" sondern nur im Nachhinein zu verändern.
    Dazu habe ich eine Ressource im Programm angelegt: "infer.txt".
    Diese versuche ich jetzt zu bearbeiten, was bisher fehlschlug.
    Ich habe heute diesen Code gefunden:
    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    System.Reflection.Assembly Assembly = System.Reflection.Assembly.LoadFile("Run4J.exe");
                System.Type[] types = Assembly.GetTypes();
                foreach (System.Type type in types)
                {
                    if (type.Name == "Resources") //prüfen, ob das die Resourcenklasse ist
                    {
                        foreach (System.Reflection.PropertyInfo prop in type.GetProperties()) // Jedes property durchlaufen
                        {
                            if (prop.PropertyType.ToString() == "System.String") //Prüfen, ob die Resource eine Textresource ist
                            {
                                    if(prop.Name == "TitelText"){ // Prüfen, ob das die zu verändernde Resource ist
                                    System.Windows.Forms.MessageBox.Show(prop.Name + " " + prop.GetGetMethod().Invoke(new object(), new object[0])); // Den wert der Resource + Name ausgeben
                                    prop.GetSetMethod().Invoke(new object(), new object[] {"Neuer Text"}); //Wert verändern
                                    System.Windows.Forms.MessageBox.Show(prop.Name + prop.GetGetMethod().Invoke(new object(), new object[0])); // Prüfen, ob der Wert geändert wurde
                                    }
                            }
                        }
                    }
     
                }
                Assembly.EntryPoint.Invoke(new object(), new object[0]); // Das bearbeitete Programm ausführen

    Allerdings bin ich mir bei diesen stellen unsicher
    was ich einsetzen muss.
    Code csharp:
    1
    
    type.Name == "Resources"

    Code csharp:
    1
    
    if (prop.Name == "TitelText")

    Die Ressource in der Run4J.exe heißt infer.dinf
    und ist direkt neben der Run4J.cs(ohne Unterordner).

    Intern lese ich sie aus mit diesem 'Pfad': "Run4J.infer.dinf"

    Kann mir jemand helfen?

    PS: Ich vermute der Code ist gar nicht dafür gedacht was ich machen will.
    infer.dinf ist eine einfache Textdatei ich ich in C# als Item eingefügt habe.
    Allerdings hab ich keinen anderen Ansätze und wen ich den Text einfach mit
    "File Einlesen".replace "file schreiben" mache kommt der ERROR: "Keine win32 Anwendung..."
    Geändert von RELAX (18.09.11 um 07:54 Uhr) Grund: Zweifel an der Welt
     

  3. #3
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Ich glaube langsam zu verstehen, was du meinst. Lass mich das kurz zusammenfassen, um sicher zu sein:
    Du hast ein Programm a.exe. Dieses soll auf der Festplatte das Programm b.exe erstellen. In b.exe wird eine String-Konstante benutzt, dessen Wert du verändern möchtest, bevor du b.exe auf die Festplatte schreibst. Und du hast den Quellcode beider Programme, richtig? Oder muss b.exe nicht unbedingt auf die Festplatte geschrieben werden, sondern reicht es wenn die Anwendung in a.exe vorhanden ist und daraus geladen werden kann?

    Meine erste Idee wäre hier auch gewesen, b.exe binär zu lesen und den gesuchten Text zu ersetzen. Ich kenne mich nicht aus, wann sowas funtkioniert. Aber wenn der alte String und der neue String die selbe Byte-Anzahl haben, dann sollte es funktionieren (also z.B. 'abc' durch 'def' ersetzen geht, aber durch 'defg' ersetzen geht nicht, vermute ich).

    Für den Fall, dass es genügt b.exe aus a.exe heraus zu laden und zu starten und b.exe nicht auf der Festeplatte vorhanden sein muss (sondern als Ressource in a.exe), dann könntest du b.exe einfach einen Befehlszeilenparameter mitgeben jedesmal, wenn b.exe gestartet wird.

    Edit: Diese Links könnten dich eventuell interessieren:
    Geändert von Shakie (18.09.11 um 11:25 Uhr)
     
    hihi = -h²

  4. #4
    RELAX RELAX ist offline Mitglied
    Registriert seit
    Jan 2011
    Beiträge
    12
    Ja, du hast recht. Mein Problem ist das das was ersetzt wird länger ist.
    Wahrscheinlich muss ich die "Compiling code during runtime" Methode benutzen.

    Eine Frage dazu. Muss man dafür einen Compiler installiert haben?
    ..also wegen der Kompatibilität u.s.w.?
     

  5. #5
    Avatar von Spyke
    Spyke Spyke ist offline Capoeirista
    Registriert seit
    Oct 2002
    Beiträge
    931
    Der .Net Compiler ist beim Framework mit bei.
    Hab sone ähnliche Anwendung für die Arbeit geschrieben, also DLL Erstellung zur Laufzeit, und da läuft kein VS.
     
    www.iv-interactive.de - Projektewebsite
    WikiParser - aktuelles Projekt

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 19.09.08, 19:11
  2. einzelne Programm mit eigenem Programm starten
    Von mgraf im Forum Microsoft Windows
    Antworten: 12
    Letzter Beitrag: 12.09.08, 21:07
  3. Gestartetes Programm kann kein weiteres Programm starten
    Von RuFFnEcK im Forum VisualStudio & MFC
    Antworten: 3
    Letzter Beitrag: 04.10.06, 13:48
  4. Antworten: 0
    Letzter Beitrag: 25.04.05, 20:06
  5. Dropper DR/Inor.M
    Von Axel007 im Forum Security (Viren, Trojaner, Spam)
    Antworten: 2
    Letzter Beitrag: 10.03.04, 15:36

Stichworte