C++ - Winapi programmieren

  • C/C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Apropos, ich bin mir nicht mehr sicher, aber die erstellten Programme sind dann ja sowieso Windows oder nicht?
    Dann lern n bissl c# und lad dir visual studio express herunter.
    Mittels C#-CodeProvider kannst du Code @ Runtime kompillieren, dh. du musst nicht mal einen Compiler mitgeben, der ist schon enthalten im .Net Framework(Fast jeder Windows PC hat .Net Framework).
    Und das ist dazu noch ziemlich einfach.
    msdn.microsoft.com/en-us/libra…p.csharpcodeprovider.aspx

    Quellcode

    1. public static bool CompileExecutable(String sourceName)
    2. {
    3. FileInfo sourceFile = new FileInfo(sourceName);
    4. CodeDomProvider provider = null;
    5. bool compileOk = false;
    6. // Select the code provider based on the input file extension.
    7. if (sourceFile.Extension.ToUpper(CultureInfo.InvariantCulture) == ".CS")
    8. {
    9. provider = CodeDomProvider.CreateProvider("CSharp");
    10. }
    11. else if (sourceFile.Extension.ToUpper(CultureInfo.InvariantCulture) == ".VB")
    12. {
    13. provider = CodeDomProvider.CreateProvider("VisualBasic");
    14. }
    15. else
    16. {
    17. Console.WriteLine("Source file must have a .cs or .vb extension");
    18. }
    19. if (provider != null)
    20. {
    21. // Format the executable file name.
    22. // Build the output assembly path using the current directory
    23. // and <source>_cs.exe or <source>_vb.exe.
    24. String exeName = String.Format(@"{0}\{1}.exe",
    25. System.Environment.CurrentDirectory,
    26. sourceFile.Name.Replace(".", "_"));
    27. CompilerParameters cp = new CompilerParameters();
    28. // Generate an executable instead of
    29. // a class library.
    30. cp.GenerateExecutable = true;
    31. // Specify the assembly file name to generate.
    32. cp.OutputAssembly = exeName;
    33. // Save the assembly as a physical file.
    34. cp.GenerateInMemory = false;
    35. // Set whether to treat all warnings as errors.
    36. cp.TreatWarningsAsErrors = false;
    37. // Invoke compilation of the source file.
    38. CompilerResults cr = provider.CompileAssemblyFromFile(cp,
    39. sourceName);
    40. if(cr.Errors.Count > 0)
    41. {
    42. // Display compilation errors.
    43. Console.WriteLine("Errors building {0} into {1}",
    44. sourceName, cr.PathToAssembly);
    45. foreach(CompilerError ce in cr.Errors)
    46. {
    47. Console.WriteLine(" {0}", ce.ToString());
    48. Console.WriteLine();
    49. }
    50. }
    51. else
    52. {
    53. // Display a successful compilation message.
    54. Console.WriteLine("Source {0} built into {1} successfully.",
    55. sourceName, cr.PathToAssembly);
    56. }
    57. // Return the results of the compilation.
    58. if (cr.Errors.Count > 0)
    59. {
    60. compileOk = false;
    61. }
    62. else
    63. {
    64. compileOk = true;
    65. }
    66. }
    67. return compileOk;
    68. }
    Alles anzeigen

    Erstellste einfach eine .Net Konsolen Applikation, rufst die von irgendwo automatisch auf, und die kompiliert dann deinen C# Code.
    WinForms und Wpf und alles andere alles möglich ohne Einschränkung.
    Man muss sich dennoch damit befassen.

    Und Win32 Steuerelemente bringst du nicht einfach, unaufwändig oder simpel ein, zumindest nicht, wenn die auch nur ein wenig Funktionalität haben sollen. Du musst da schon ein ganzes kleines Framework drum rum basteln...
    "das war meine letzte flamewar PM an dich ."
  • 1.es wäre natürlich der hammer wenn ich das .net vorinstallierte franework benutzen könnte. 8o
    2.könntest du mir noch einaml in einafcher reihenfolge sagen was ich jetzt tuen muss, den code compilieren und das dann as compileraufruf für den .net compiler verwenden oder was??? (sry ich bin irgendwie nicht mitgekommen)

    Danke im Vorraus :thumbup:
    1. Erstell ne C# Applikation in Visual Studio(oder sonst wo)
    2. Du könntest zB. ne static main Methode erstellen, und die übergeben Argumente ist das zu kompilierende Code File oder sowas:

      Quellcode

      1. static void Main(string[] args)
      2. {
      3. var filename = args[0];
      4. CompileExecutable(filename);
      5. }

      (Benützt die Funktion von oben)
      Du wirst dann noch den Namespace System.CodeDom.Compiler brauchen und evtl Microsoft.CSharp und Microsoft.VisualBasic (google "C# namespace", wenn du nich weis, was ich mein).
      Dieser Code kann sogar vb Code kompilieren.
      Die Exe wird im selben Verzeichnis wie deine erstelle App sein(Analysier einfach die CompileExecutable Methode).
    3. Ein Test C# File erstellen
    4. Das ganze vom GM ausführen:
      Dazu musst du einfach dein Programm ausführen und den Pfad zum Codefile als Argument mitgeben(Die Funktion dazu fällt mir grad nich ein).
    "das war meine letzte flamewar PM an dich ."
  • Könntest du mir diese c# applikation machen bitte :) , nicht weil ich zu faul bin sondern weil mein internet 20kb/s bei runterladen schnell ist und da sitz ich morgen noch da :thumbdown: .Ich hab übrigens Microsoft Visual Basic 2010 Express oben, keine Ahnung ob mir das was bringt. ?(
  • Du kannst das auch mit Visual Basic machen, aber da kann ich dir nich helfen..
    Ich würde dir ja schon schnell so ein Programm machen können: Aber was bringt es, wenn du nun so eine App hast, die C# kompilieren kann, du aber kein C# beherrschst?
    "das war meine letzte flamewar PM an dich ."
  • könntest du mir sie trotzdem machen :rolleyes: , ich will eh klein anfangen aber wenn ich nicht einen compiler habe der mir jetzt irgend eine sprache aus der c-familie compiliert dann hatts auch keinen sinn mir jetzt 6stunden lang c# youtube tutorials anzuschauen. Ich möchte einfach mal die Grundlage schaffen bevor ich mich richtig ranhau, weil ohne grundlage kann ich dann auch nix anfangen, ausser das ich ein bisschen c# gelernt hab 8) .
  • Du brauchst eine Grundlage, damit du was mit dem anfangen kannst... Du musst C# und .Net schon ein wenig verstehen, um das anwenden zu können. Also egal wie lange es dauert: Lad dir erstmal Visual C# runter: go.microsoft.com/?linkid=9709943
    Was willst du dann überhaupt letztenendes damit bewerkstelligen?

    Und hier ein paar zufällige Google C# Tutorial Resultate:
    openbook.galileocomputing.de/csharp/ ein free Open Book

    msdn.microsoft.com/de-de/library/aa288436(VS.71).aspx Tutorials von Msdn, allgemein ist msdn eine Grosse Quelle des .Net Wissens.


    Du musst verstehn: Es bringt nix, tausend coole externe Sachen in dein Programm/Spiel zu implementieren, wenn du sie gar nicht verstehst und nur an der Oberfläche kratzt bzw nix grosses damit anstellen kannst.
    Ausserdem solltest du schon selber in der Lage zu sein, aus meinen Code-Beilagen ein funktionierendes Program zu schreiben.
    "das war meine letzte flamewar PM an dich ."
  • Ok hab mir jetzt die visual c# 2010 gesaugt und schau mir mal ein paar tutorials an, auch bei youtube weil ich am besten visuell lernen kann (Halb Test) aber bei konkreten fragen schau ich mir dann einfach die detaillierten Tutorials an. Ich hab mir den code durchgeschaut. Also hab ichs richtig verstanden *stotter*:
    Der compileExecutable code initalisiert einen befehl nämlich den der dann die exe aus der .cs macht. oder?? :huh:
    Der untere code ist dann die eigenetliche main funktion und führt diesen code dann mit dem mitgegeben 2ten programmparameter (argument) aus!

    Soweit richtig??? Laut meinen aussagen müsst ich jetzt nur den ersten vor den zweiten code in eine dos anwendung hauen und finish. ?( :)

    €dit: jezt hab ich eh grad 70kb/sek das geht für meine verhältnisse :D
  • jup so grob stimmt das.
    Einfach Code in irgendeine Klasse haun (zb einfach ne Console Application erstellen) und müsste klappen, aber ist halt ungetestet.
    Wenn du später zusätzliche Assemblies referenzieren möchtest(zB. für prinzipiellen Dinge brauchst du schonmal System.dll), musst du bei den compilerParameters noch sowas hinzufügen:

    Quellcode

    1. cp.ReferencedAssemblies.Add( "System.dll" );


    Siehe hier: msdn.microsoft.com/de-de/libra…referencedassemblies.aspx
    Du wirst die ganzen Optionen sicher noch brauchen.

    Für Windows Forms zB. müsstest du dann etwa System.Windows.Forms.dll referenzieren:
    msdn.microsoft.com/de-de/libra…ws.forms.application.aspx


    edit: using namespaces nicht vergessen(Die CodeDom Provider von oben)
    "das war meine letzte flamewar PM an dich ."

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von blubberblub ()

  • Was muss ich machen damit er den CodeDomProvider und FileInfo kennt??? ?( (ich weis ich bin ein newbie)

    Edit: Könntest du mir vll die 2 Codes mal zu einem funktionierendem machen mit der system.windows.forms.dll und der system.drawing.dll machen denn meine Anfänger Augen beginnen sich schön langsam zu verdrehen :wacko: .Bitte wär voll nett und önntest du die stelle kommentieren wo diese dlls (siehe eine zeile drüber) mitverwendet oder so werden. :) Danke schonmal im vorraus, also wenn du zeit hast dan bitte füge mir die codes sinnvoll zusammen so das ich sie dann reinkopieren kann in visual c# und ausprobieren.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von whiterock ()

  • Ok, ganz oben im Code musst du deklarieren, welche Namespaces du benutzen möchtest, in dem fall System.IO(In, Out, Ein- und Ausgabe) und System.CodeDom.Compiler:

    Quellcode

    1. using System;
    2. using System.IO;
    3. using System.CodeDom.Compiler;




    Anschliessend brauchst du eine Klasse, in der du die Methoden reinhauen kannst:

    Quellcode

    1. class Program
    2. {
    3. //hier
    4. }


    In die Klasse musst du die 2 Methoden von weiter oben reinhauen:

    Quellcode

    1. class Program
    2. {
    3. public static void Main(int[] args)
    4. {
    5. ...
    6. }
    7. public static bool CompileExecutable(...)
    8. {
    9. ..
    10. }
    11. }
    Alles anzeigen



    Um dlls hinzuzufügen fügst du den Code

    Quellcode

    1. cp.ReferencedAssemblies.Add("DeineAssembly.dll");

    am besten einfach direkt nach diesem Code in der CompileExecutable Methode ein:

    Quellcode

    1. CompilerParameters cp = new CompilerParameters();
    2. //Hier
    3. //zb:
    4. cp.ReferencedAssemblies.Add("System.dll");
    5. cp.ReferencedAssemblies.Add("System.Windows.Forms.dll");


    Was muss ich machen damit er den CodeDomProvider und FileInfo kennt??

    Look here: social.msdn.microsoft.com/search/de-de/?query=fileinfo

    Da steht FileInfo-Klasse, und das in der Klammer ist der Namespace (System.IO).
    Nun schreibst du einfach using System.IO; ganz oben in deinen Code, vor der Klassen-deklaration(Wie ich schon oben beschriieben hab).

    Dann versuch mal zu kompilieren, kanns zur Zeit eh nicht(nicht wirklich, theoretisch schon) testen(bin auf Kubuntu :D).
    "das war meine letzte flamewar PM an dich ."
  • ok soweit so gut, du hast nur ein so ein using ding vergessen:

    using System.Globalization; ;)

    wie kann ich eigentlich die datei als exe alleine irgendwo hinspeichern damit ich aussprobieren kann denn dafür kann man ja zum beispiel einfach eine verknüpfung zur exe machen und bei ziel hinter den dateipfad seine .cs datei schreiben. :D ???
  • whiterock schrieb:

    ok soweit so gut, du hast nur ein so ein using ding vergessen:

    using System.Globalization; ;)

    Hehe, deswegen hab ich auch gleich erklärt, wie man herausfindet, welche Namespaces man benötigt xP

    whiterock schrieb:


    wie kann ich eigentlich die datei als exe alleine irgendwo hinspeichern damit ich aussprobieren kann denn dafür kann man ja zum beispiel einfach eine verknüpfung zur exe machen und bei ziel hinter den dateipfad seine .cs datei schreiben. :D ???

    Ehm, ich versteh zwar nich ganz was du meinst, aber beide exen(das Program zur Erstellung von Programmen und das generierte Programm) befinden sich im Projekt-Verzeichnis bin/debug oder debug/ oder sowas, weis grad nicht auswendig. Wenn du nix geändert hast, befindet sich das Projektverzeichnis unter Eigene Dateien/Visual C#/Projekte oder sowas (bzw Dokumente/Visual C#/Projekte unter Vista+), kanns dir nicht genau sagen. Im Normalfall kannst du die exe-Dateien einfach irgendwo hin kopieren, solange du nicht externe Ressourcen bzw Dlls hast(Dann müsstest du diese einfach mitkopieren.
    "das war meine letzte flamewar PM an dich ."
  • Du hast wahrscheinlich keinen Parameter mitgegeben...

    Du solltest dein Programm generell mit Visual C# ausführen und debuggen(F5), dann siehst du, wo der Fehler auftritt und kannst die Werte aller lokalen Variablen überprüfen.
    Kannst ja in der Main Funktion ganz am Anfang noch folgendes hinzufügen:

    Quellcode

    1. Console.WriteLine("Arguments: ");
    2. int i = 0;
    3. foreach (var str in args)
    4. {
    5. Console.WriteLine(i+": "+str);
    6. i++;
    7. }

    Dann siehst du, welche Argumente übergeben wurden.

    Um den Fehler zu beheben, musst du wohl überprüfen, ob überhaupt Argumente übergeben worden sind:

    Quellcode

    1. if (args.Length > 0)
    2. {
    3. //Kompilliere das .cs File
    4. }
    5. else
    6. {
    7. Console.WriteLine("Bitte den Pfad zu der zu kompillierenden Code-Datei angeben!");
    8. }
    "das war meine letzte flamewar PM an dich ."
  • ich hab jetzt versucht das programm zu starten und ich hab args mit arguments[1] ersetzt ( String[] arguments = Environment.GetCommandLineArgs(); )
    weil args nicht geklappt hat. Und ich hab mal ne verknüpfung zu dem programm erstelltr um ihm programm parameter mitzugeben (indem fall den pfad zur .cs datei des Programms selber, zum testen obs eh richtig kompiliert). Hab dann das ganze ausgeführt und bekam nen errors building....fehlt ein assemblyverweis???.er sagte auch was von codeDom. Was hab ich falsch gemacht, visual kanns ja auch kompilieren??? und kann das sein das jetzt das was du oben genannt hast ins spiel kommt mit diesen cp.reference oder so??? ?( (ich hab das so ne vermutung :P )
  • Ob arguments oder args is ja egal, hätte schon so geklappt.
    Musst schon genauer sagen, was du gemacht hast und was genau fürn Error gekommen is... Wie sieht dein Code aus?
    CodeDom selber is eigentlich im System.dll..
    Versuch doch erstmal einfach nur, per cmd direkt die exe auszuführen, und zwar mit einem .cs File am besten im selben Verzeichnis wie die Exe, ohne Verknüpfungen und so nem Kram.
    "das war meine letzte flamewar PM an dich ."
  • das mit den args hat aber nicht geklappt!!! :rolleyes: (10Mal propiert, oder du meinst was anderes als ich, ich meinte das man dem prgramm kommandozeilen mitgeben kann, deswegen String[] arguments = Environment.GetCommandLineArgs(), da hat deine args variable leider nicht geklappt :( )

    Und die error building message sieht so aus:

    Errors building C:\Users\Alex\Documents\Visual Studio 2010\Projects\.net connect
    er\Program.cs into C:\Users\Alex\Documents\Visual Studio 2010\Projects\dotNetCon
    necterExe\Program\bin\Debug\Program_cs.exe
    c:\Users\Alex\Documents\Visual Studio 2010\Projects\.net connecter\Program.cs(
    3,14) : error CS0234: Der Typ- oder Namespacename "CodeDom" ist im Namespace "Sy
    stem" nicht vorhanden. (Fehlt ein Assemblyverweis?)


    Was ist falsch??? 8|
  • Es muss aber so gehen mit den argumenten, da brauchst doch keine so funktion!

    Der Fehler ist seltsam.. was hast du für dll-Referenzen in deinem Projekt?
    Versuchst du da das Projekt zu builden oder ein einzelnes .cs mit dem erstellten Programm zu kompilieren?

    \Visual Studio 2010\Projects\.net connecter

    Gewöhn dir an, bessere Pfadnamen zu wählen, vermeide Leerzeichen oder Punkte...

    Wie sehen deine Code Files aus?

    Gug hier ein Beispiel wegen den Arguments:
    Spoiler anzeigen

    Quellcode

    1. using System;
    2. public class Hello3
    3. {
    4. public static void Main(string[] args)
    5. {
    6. Console.WriteLine("Hello, World!");
    7. Console.WriteLine("You entered the following {0} command line arguments:",
    8. args.Length );
    9. for (int i=0; i < args.Length; i++)
    10. {
    11. Console.WriteLine("{0}", args[i]);
    12. }
    13. }
    14. }
    Alles anzeigen


    Das MUSS gehen!
    "das war meine letzte flamewar PM an dich ."