Forum: PC-Programmierung Visual C++ 2010 Express mit FileHandle


von skorpionx (Gast)


Lesenswert?

Das sind meine erste Schritte mit Microsoft Visual C++ Express.
Als Erweiterung habe ich nur NuGet Packagert installiert.
Ich habe angefangen mit Files Händling. Mit
SaveFileDialog habe ich kein Problem. Also Name und Auswahl
für File funktioniert.
Ich bin aber gewönnt mit FileHandle zu arbeiten.
Vorher habe ich etwas mit Borland C++ Builder gearbeitet:
Was muss ich in Visual C++ um das zu erreichen.
Beispiel von Borland:

  HANDLE OutDateiHandle;
  DWORD  LaengeAllocPuff;
  HANDLE StandardHeapHandle;
  LPVOID PointerAllocPuff;


  OutDateiHandle=INVALID_HANDLE_VALUE;
  PointerAllocPuff=0;

                LaengeAllocPuff=DATENLAENGEPARAMETEROUT;


                StandardHeapHandle = GetProcessHeap(); 
//Handle vom StandardHeap

                PointerAllocPuff=HeapAlloc(StandardHeapHandle, 
//Speicher für IN ExcelDatei
                                        0,
                                        LaengeAllocPuff);

                if (PointerAllocPuff==0)  // kein Speicher am HEAP
                 {
                        //Meldung2->Caption ="Zu wenig HeapSpeicher";
                        Meldung2->Caption ="heap-based memory allocation 
error";
                     goto Fehler;
                 }

              OpenDialog1->FileName="*.TXT";
              SaveDialog1->DefaultExt="TXT";
              //SaveDialog1->Title = "Konfiguration in Datei 
abspeichern";
              SaveDialog1->Title = "Configuration Save";
         if (!(SaveDialog1->Execute()))    // Wenn File ausgewählt dann 
return true
         {
                //Meldung2->Caption ="Konfiguration wurde nicht 
abgespeichert";
                Meldung2->Caption ="Configuration was not saving";
               goto Fehler;
          }
                //SaveDialog1->FileName.c_str();
                OutDateiHandle=CreateFile(SaveDialog1->FileName.c_str(),
                        0,
                        0,
                        0,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        0);
           if (OutDateiHandle!=INVALID_HANDLE_VALUE)     //Die File ist 
schon da
            {
….

: Gesperrt durch User
von Dr. Sommer (Gast)


Lesenswert?

CreateFile, HANDLE und Konsorten sind Teil des Win32-API. Die kannst du 
genauso in Visual Studio nutzen. Es ist natürlich dringend zu empfehlen, 
nicht diese Windows-Spezifischen Dinge zu nutzen, sonderd z.B. das 
portable std::ifstream statt CreateFile, statt "HeapAlloc" einfach 
"new", "goto" sowieso gar nicht (dafür gibt's Exceptions).

von Dieter (Gast)


Lesenswert?

skorpionx schrieb:
> Das sind meine erste Schritte mit Microsoft Visual C++ Express.

Dann tu dir selbst einen gefallen und wechsel gleich noch auf was 
vernünftiges. Jetzt gehts noch ganz leicht, in ein paar Jahren wirst du 
dich wahnsinnig ärgern.

von Dr. Sommer (Gast)


Lesenswert?

Was ist denn an MSVC unvernünftig, und welche IDE ist für Windows C++ 
Programme besser geeignet?

von Keiner N. (nichtgast)


Lesenswert?

Dieter schrieb:
> Dann tu dir selbst einen gefallen und wechsel gleich noch auf was
> vernünftiges. Jetzt gehts noch ganz leicht, in ein paar Jahren wirst du
> dich wahnsinnig ärgern.

hm,
zum Beispiel VS2017 Community Edition. :)

: Bearbeitet durch User
von skorpionx (Gast)


Lesenswert?

FILE * pFile;

     SaveFileDialog  SaveFileDialog1 ;
      SaveFileDialog1.Filter =
         "JPeg Image|*.jpg|Bitmap Image|*.bmp|Gif Image|*.gif";
      SaveFileDialog1.Title = "Save an Image File";
      SaveFileDialog1.ShowDialog();
      // If the file name is not an empty string, open it for saving.
      if(SaveFileDialog1.FileName != "")
            {

              pFile = fopen (PointerAufName , "w");

Wie kann ich von SaveFileDialog1.FileName Pointer auf string mit Name 
bekommen. In Borland war das SaveDialog1->FileName.c_str()

von Dr. Sommer (Gast)


Lesenswert?

Verrate doch erstmal, wo die ominöse SaveFileDialog-Klasse herkommt. 
Benutzt du C++/CLI und die kommt aus .NET? Oder MFC? Oder...?
Und warum verwendest du FILE* aus C, und nicht std::ifstream aus C++?

von skorpionx (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Verrate doch erstmal, wo die ominöse SaveFileDialog-Klasse herkommt.

Microsoft Visual C++ Express.
Als Erweiterung habe ich nur NuGet Packagert

von Dr. Sommer (Gast)


Lesenswert?

skorpionx schrieb:
> Microsoft Visual C++ Express.

So weit waren wir schon. Das unterstützt verschiedene 
Programmiersprachen und -Umgebungen. Wie hast du dein Projekt angelegt? 
Als C++ oder C++/CLI Projekt? Was für #include's hast du? Du kannst doch 
nicht einfach irgendwelche Klassen verwenden ohne eine Ahnung zu haben 
woher die kommen.

von skorpionx (Gast)


Lesenswert?


von Dr. Sommer (Gast)


Lesenswert?

Also wenn das mit der Salamitaktik so weiter geht können wir das auch 
bleiben lassen. Da kann man nur raten, ein aktuelles Buch über Windows 
C++ Programmierung zu lesen und das ganze alte Gedöns zu vergessen.

von skorpionx (Gast)


Lesenswert?

Dieser SaveFileDialog läuft. Ich will nur die Datei öffnen. Warum so?. 
Das muss für andere Teile von meinen Programmen passen. Ich programmiere 
hauptsätzlich in C.

von Dr. Sommer (Gast)


Lesenswert?

skorpionx schrieb:
> Dieser SaveFileDialog läuft.

Schön. Da aber keiner weiß was das für einer ist, kann dir niemand 
helfen dessen Ausgabe zu nutzen. Bei .NET gibt es eine Klasse die so 
heißt, aber das verwendest du ja angeblich nicht.

skorpionx schrieb:
> Ich will nur die Datei öffnen
So geht das in Standard-C++:
1
std::ifstream is ("datei.txt");
2
std::string data;
3
is >> data;

von skorpionx (Gast)


Lesenswert?

Dr. Sommer schrieb:
> std::ifstream is ("datei.txt");

Das weiß ich. Aber ich brauche von meinem  Name im Dialog von 
SaveFileDialog1.FileName Wandlung in  „datei.txt“ .

von Dr. Sommer (Gast)


Lesenswert?

skorpionx schrieb:
> Aber ich brauche von meinem  Name im Dialog von
> SaveFileDialog1.FileName Wandlung in  „datei.txt“ .

Ja. Wie stellst du dir vor soll man dir helfen, wenn keiner weiß was für 
eine SaveFileDialog-Klasse das ist und wo sie her kommt? Siehe 
Netiquette.

von skorpionx (Gast)


Lesenswert?

SaveFileDialog1.FileName.ToCharArray()

Das wird schon akzeptiert. Morgen teste ich das weiter.

von Dr. Sommer (Gast)


Lesenswert?

skorpionx schrieb:
> SaveFileDialog1.FileName.ToCharArray()

Das sieht schwer nach .NET aus:
https://msdn.microsoft.com/de-de/library/ezftk57x(v=vs.110).aspx

Dann war das hier gelogen:

skorpionx schrieb:
> Dr. Sommer schrieb:
>> Als C++

Und es ist doch C++/CLI. Fragt sich natürlich, warum man sich das ohne 
Not antut und nicht direkt C# oder doch richtiges C++ nutzt.

In C++/CLI kannst du es z.B. so machen:
1
Stream^ fileStream;
2
if ( result == DialogResult::OK ) {
3
  fileStream = SaveFileDialog1->OpenFile();
und .NET vollständig verwenden und die Standard C++ Klassen weglassen. 
Oder den String direkt an die System.IO.FileStream Klasse übergeben. 
ToCharArray() ist dann in jedem Fall unnötig.

von skorpionx (Gast)


Angehängte Dateien:

Lesenswert?

Beim Auswahl habe ich Windows Forms-Anwendung gewählt.

von Dr. Sommer (Gast)


Lesenswert?

skorpionx schrieb:
> Beim Auswahl habe ich Windows Forms-Anwendung gewählt.
Ah, endlich wissen wir es. Das legt ein C++/CLI Projekt an. C++/CLI mit 
Win Forms ist eine ist eine veraltete Technologie, die von aktuellen 
Visual Studio Versionen gar nicht mehr unterstützt wird. Ist also nicht 
sehr zu empfehlen.
Sinnvoller wäre es normales C++ mit MFC (auch ziemlich alt) oder z.B. Qt 
zu nutzen, oder einfach C# mit .NET (aktuell und einfach).

von skorpionx (Gast)


Lesenswert?

Das funktioniert (nur fs->Seek macht noch Probleme):

   char TestV[3];
  TestV[0]='0';
  TestV[1]='1';
  TestV[2]='1';


      // Set the properties on SaveFileDialog1 so the user is
      // prompted to create the file if it doesn't exist
      // or overwrite the file if it does exist.
      saveFileDialog1->CreatePrompt = true;
      saveFileDialog1->OverwritePrompt = true;

      // Set the file name to myText.txt, set the type filter
      // to text files, and set the initial directory to the
    // MyDocuments folder.
      saveFileDialog1->FileName = "";
    // DefaultExt is only used when "All files" is selected from
      // the filter box and no extension is specified by the user.
      saveFileDialog1->DefaultExt = "txt";
      saveFileDialog1->Filter = "Text files (*.txt)|*.txt|All files 
(*.*)|*.*";
    saveFileDialog1->FilterIndex = 2;
      saveFileDialog1->RestoreDirectory = true;
    saveFileDialog1->Title = "Save  File";



      // Call ShowDialog and check for a return value of 
DialogResult.OK,
      // which indicates that the file was saved.
    saveFileDialog1->ShowDialog();

    if(saveFileDialog1->FileName != "")
       {
         System::IO::FileStream ^ fs ;
         fs= 
safe_cast<System::IO::FileStream^>(saveFileDialog1->OpenFile());
     if(fs)

     {
     unsigned int i;
         for(i=0;i<=sizeof(TestV);++i)
      fs->WriteByte( TestV[i] );


      // Set the stream position to the beginning of the file.
          //fs->Seek( 1, SeekOrigin::Begin );

      fs->Close();

     }

      }

von Herr Rebentrost (Gast)


Lesenswert?

skorpionx schrieb:
> Das sind meine erste Schritte mit Microsoft Visual C++ Express.

Mir scheint, dass die wichtigsten Hinweise gar nicht bei dir ankommen.

Du verwendest eine Uralt-Version von Visual Studio, die (*) nicht einmal 
den vorletzten C++-Standard halbwegs vernünftig implementiert, dafür 
aber die unsägliche Kombination von C++/CLI und Windows Forms als 
Projekt zulässt, welche schon lange nicht mehr unterstützt wird (und 
imho auch nie offiziell empfohlen wurde).

skorpionx schrieb:
> Das funktioniert

Du kommst vom C++ Builder, darum vermutlich die Idee mit C++/CLI für 
eine Anwendung mit GUI. Das ist durchaus nachvollziehbar und du kannst 
natürlich machen, was du willst - aber vielleicht kannst du dein 
persönliches Ignorierfeld trotzdem kurz einen ganz kleinen Spalt öffnen 
und zumindest die Möglichkeit in Betracht ziehen, dass es keine gute 
Idee ist, in die du dich da anscheinend verrannt hast, ganz egal, ob 
dabei nun irgendein Detail "funktioniert" oder nicht. C++/CLI ist nur 
für sehr wenige Spezialfälle sinnvoll einsetzbar (z.B., um 
umfangreichere C- oder C++-Bibliotheken und .NET unter einen Hut 
bekommen).

(*) Natürlich der mitinstallierte Compiler, aber auch VS selbst.

von Reinhard (gotbread)


Lesenswert?

skorpionx schrieb:
> Beim Auswahl habe ich Windows Forms-Anwendung gewählt.

Und da ist auch schon der Fehler.
Du willst "Win32-Projekt" auswählen. Da du das ganze in
gutem alten C machen willst, so würde das aussehen:
1
#include <windows.h>
2
3
int WINAPI WinMain(HINSTANCE, HINSTANCE, char *, int)
4
{
5
    char filename[MAX_PATH] = { 0 };
6
    OPENFILENAME ofn = { 0 };
7
    ofn.lStructSize = sizeof(ofn);
8
    ofn.lpstrFilter = "Text files (*.txt)\0*.txt\0";
9
    ofn.lpstrFile = filename;
10
    ofn.nMaxFile = sizeof(filename);
11
    ofn.lpstrDefExt = "txt";
12
    ofn.Flags = OFN_EXPLORER | OFN_HIDEREADONLY;
13
    if (GetSaveFileName(&ofn))
14
    {
15
        HANDLE hFile = CreateFile(filename,    // name of the file
16
                       GENERIC_WRITE,          // open for writing
17
                       0,                      // do not share
18
                       NULL,                   // default security
19
                       CREATE_NEW,             // create new file only
20
                       FILE_ATTRIBUTE_NORMAL,  // normal file
21
                       NULL);
22
        if (hFile == INVALID_HANDLE_VALUE)
23
        {
24
            MessageBox(0, "something happend", "Error", MB_ICONERROR);
25
            return -1;
26
        }
27
28
        // write
29
        char stuff[] = {'H', 'a', 'l', 'l', 'o'};
30
        for (int i = 0; i < sizeof(stuff); ++i)
31
            WriteFile(hFile, stuff + i, 1, 0, 0);
32
33
        // seek
34
        SetFilePointer(hFile, 0, 0, FILE_BEGIN);
35
36
        // close
37
        CloseHandle(hFile);
38
    }
39
}

von skorpionx (Gast)


Lesenswert?

Reinhard S. schrieb:
> Und da ist auch schon der Fehler.

Ich programmiere gerne in C, aber benutze ich gerne bestimmte 
Möglichkeiten
von C++. Einige  von dieser Möglichkeit sind z.B SaveFileDialog oder 
OpenFileDialog. In wenigen Schritten hat man intelligenten Zugang zum 
Filesystem über Windowsstandard. Ich kann jeden Verzeichnis erreichen, 
Neue Verzeichnisse anlegen und Namen beim Abspeicherung frei editieren.
Und das funktioniert schon. Alles andere mache ich  in C. C ist eine 
kompakte Sprache mit wenigen Befehlen und das für mich ist enormen 
Vorteil.In C++ findet man Klassen die hunderte Methoden(Funktionen) oder 
Eingenschaften haben. Ab und zu findet man Sachen die nur sehr ähnlich 
aussehen und unterscheiden sich nur in Kleinigkeiten. Und das kann sehr 
verwirrend  sein. In meinem Beispiel Oben nach längere Zeit fand ich 
diese „safe_cast“. Erst danach lief das alles.

von Dr. Sommer (Gast)


Lesenswert?

skorpionx schrieb:
> Möglichkeiten
> von C++. Einige  von dieser Möglichkeit sind z.B SaveFileDialog oder
> OpenFileDialog. In

Nochmal: Das ist keine Möglichkeit von C++. C++ kennt kein 
SaveFileDialog. Das ist eine Klasse, die du über die veraltete 
Kombination C++/CLI + WinForms ansprichst. Auch für C++ gibt es 
nicht-veraltete Möglichkeiten für Datei-Dialoge, wie bei Qt, MFC oder 
GTKmm mitgeliefert.

skorpionx schrieb:
> In wenigen Schritten hat man intelligenten Zugang zum
> Filesystem über Windowsstandard.
Es gibt keinen Windows-Standard. Es gibt aber z.B. den Standard POSIX, 
an den sich aber Windows nicht/eingeschränkt hält.

skorpionx schrieb:
> Ich kann jeden Verzeichnis erreichen,
> Neue Verzeichnisse anlegen und Namen beim Abspeicherung frei editieren.
Das hat nix mit C++, C++/CLI, oder .NET zu tun. Das können (fast?) alle 
Programmiersprachen.

skorpionx schrieb:
> In C++ findet man Klassen die hunderte Methoden(Funktionen) oder
> Eingenschaften haben.
"Methode" ist ein Begriff aus Java. Gerade hast du noch gesagt, dass du 
solche Klassen haben willst (wie SaveFileDialog). Und die Klassen in 
Standard-C++ sind nicht derart kompliziert, aber z.B. die von .NET, die 
aber von normalem C++ gar nicht nutzbar sind.

skorpionx schrieb:
> Ab und zu findet man Sachen die nur sehr ähnlich
> aussehen und unterscheiden sich nur in Kleinigkeiten. Und das kann sehr
> verwirrend  sein.
Es werden halt alle Möglichkeiten abgedeckt. Gibt's in allen Sprachen.

skorpionx schrieb:
> In meinem Beispiel Oben nach längere Zeit fand ich
> diese „safe_cast“.
Das hat auch nix mit C++ zu tun, sondern ist C++/CLI. Ist außerdem 
unnötig, du könntest einfach direkt System.IO.Stream nutzen.

C++/CLI ist heute eigentlich nur noch dazu da, low-level Bindings für 
die .NET-Sprachen wie C# zu entwickeln, nicht zur Entwicklung ganzer 
Anwendungen. Auch aus C kann man Datei-Dialoge öffnen, und das ist keine 
veraltete Technik.

von Dr. Sommer (Gast)


Lesenswert?

Das Win32-API bietet schon seit Ewigkeiten die Möglichkeit direkt aus C 
oder richtigem C++ (nicht C++/CLI) Datei-Dialoge zu öffnen ohne 
zusätzliche Frameworks:

https://msdn.microsoft.com/de-de/library/windows/desktop/ms646839(v=vs.85).aspx

Auch nicht besonders schön, aber besser als C++/CLI und du kannst bei C 
bleiben (was ich zwar auch nicht empfehlen würde, aber ok).

von skorpionx (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Nochmal:

Mit Ihren Monologen könnten Sie aufhören. Ich habe mich
hier mit meinen momentanen Problemen gemeldet die selbst
gelöst habe.Ihre Vorschläge dazu taugten nichts.

von Dr. Sommer (Gast)


Lesenswert?

skorpionx schrieb:
> die selbst
> gelöst habe.Ihre Vorschläge dazu taugten nichts.
Also, das OpenFile hab ich zuerst genannt. Wenn du das überlesen hast, 
dein Problem... Da du ja nichtmal dazu in der Lage warst die fragliche 
Programmiersprache zu benennen, ist es schwierig sinnvoll zu helfen.

von Reinhard (gotbread)


Lesenswert?

skorpionx schrieb:
> Einige  von dieser Möglichkeit sind z.B SaveFileDialog oder
> OpenFileDialog. In wenigen Schritten hat man intelligenten Zugang zum
> Filesystem über Windowsstandard. Ich kann jeden Verzeichnis erreichen,
> Neue Verzeichnisse anlegen und Namen beim Abspeicherung frei editieren.

Das ist exakt die selbe Funktionalität die dir
GetSaveFileName (siehe code oben) gibt. Alles andere
ist ein Wrapper um diese Funktion und reicht die Parameter
nur Eins zu Eins durch.

von skorpionx (Gast)


Lesenswert?

Manche handeln auf diesem Forum (und nicht nur hier...) als religiöser 
Eifer

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Da der Threadstarter nicht an normalen Umgangsformen interessiert zu 
sein scheint, beende ich das Drama hier jetzt mal.

Dieser Beitrag ist gesperrt und kann nicht beantwortet werden.