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
{
….
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).
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.
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. :)
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()
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++?
Dr. Sommer schrieb:> Verrate doch erstmal, wo die ominöse SaveFileDialog-Klasse herkommt.
Microsoft Visual C++ Express.
Als Erweiterung habe ich nur NuGet Packagert
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.
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.
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.
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++:
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“ .
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.
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.
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).
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();
}
}
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.
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
intWINAPIWinMain(HINSTANCE,HINSTANCE,char*,int)
4
{
5
charfilename[MAX_PATH]={0};
6
OPENFILENAMEofn={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
HANDLEhFile=CreateFile(filename,// name of the file
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.
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.
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).
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.
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.
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.