Verketten von Strings (Registry & Datei)
-
Hallo,
ich habe ein kleines Problem. Mein Programm ließt aus der Registry eine Pfadangabe aus. Diese wird in einen AnsiString gespeichert. Dann holt sich das Programm einen Datei und speichert ihren Namen ebenfalls in einem AnsiString. Nun möchte ich aus den beiden Strings gerne einen einzigen machen.
Beispiel:
Pfad aus der Registry: C:\temp
Datei: test.txt
--> Pfad+"\"+Datei
Demnach sollte der Inhalt der neuen Variable eigentlich C:\temp\\test.txt sein. Ist aber nicht der Fall. Stattdessen enthält diese Variable lediglich die Pfadangabe!Ich habe dann mal probiert die Pfadangabe im Programm zu definieren und dann hat es geklappt (also wenn ich sage sPfad = "C:\temp"; ) -> was mache ich da falsch? Ich füge mal den Code hier ein, wie die Variablen zu Stande kommen.
sNWNPfad
String BioNWNPath = "Software\\BioWare\\NWN\\Neverwinter"; HKEY rHandleNWNPath; long rOpenNWNPath = RegOpenKeyEx(HKEY_LOCAL_MACHINE, BioNWNPath.c_str(), NULL, KEY_ALL_ACCESS, &rHandleNWNPath); if (rOpenNWNPath != ERROR_SUCCESS) { ShowMessage("Error: KeyPath"); return; } DWORD dwData = 256; BYTE bData[256] = ""; String NWNPath = "Location"; String NWNPathValue = ""; if (RegQueryValueEx(rHandleNWNPath, NWNPath.c_str(), 0, 0, bData, &dwData)==ERROR_SUCCESS) { for (DWORD i=0; i<dwData; i++) NWNPathValue = NWNPathValue + (char)bData[i]; // Verzeichnis speichern sNWNPfad = NWNPathValue; // Text für Label generieren NWNPathValue = "NWN Pfad: " + NWNPathValue; lblNWNPath->Caption = NWNPathValue; }
Dateiname: (enthält dann test.txt)
AnsiString sDatei = FTPClient->FTPDirectoryList->name->Strings[2];
Zusammenfügen:
AnsiString sZiel; sZiel = sNWNPfad+"\\"+sDatei;
sZiel enthält nun, wenn ich es mir anzeigen lasse, den Wert C:\temp (das, was er aus der Registry gelesen hat). Wenn ich alle drei Variablen einzeln anzeigen lasse, dann hat sNWNPfad den Wert C:\temp , sDatei den Wert test.txt und wie erwähnt sZiel nur den Wert c:\temp. Warum macht er da den Rest nicht dran?
Danke schonmal!
-
Steht da 'c:\\temp' oder 'c:\\temp\' drin?
Da das mischen von Strings und AnsiStrings kein Prolbem ist, sollte das so funktionieren. Es sei denn sDatei ist zum Zeitpunkt der Verwendung leer...
Vielleicht irgendwo ein Logikfehler drin?
-
Joe_M. schrieb:
Steht da 'c:\\temp' oder 'c:\\temp\' drin?
in sNWNPfad steht "c:\temp" drin.
Da das mischen von Strings und AnsiStrings kein Prolbem ist, sollte das so funktionieren.
Habe ich auch gedacht, deswegen bin ich ja so confused. Würde es weiterhelfen, wenn ich den gesamten Quellcode meines Programms hier veröffentliche?
-
Unit1.cpp:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" //#include <idglobal.hpp> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma link "SHDocVw_OCX" #pragma resource "*.dfm" TFormMain *FormMain; //--------------------------------------------------------------------------- __fastcall TFormMain::TFormMain(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TFormMain::Beenden1Click(TObject *Sender) { Application->Terminate(); } //--------------------------------------------------------------------------- void __fastcall TFormMain::FormCreate(TObject *Sender) { // Globale Variablen mit Werten füllen sVersion = "0.1"; iDebug = 1; // Dezimaltrennungszeichen setzen this->SystemDecimalSeparator = DecimalSeparator; DecimalSeparator = '.'; // Inhalt der statischen Labels anpassen FormMain->Caption = "ZdD Patcher vers. "+sVersion; lblInstalledVersion->Caption = "Hak Version: "; lblStatus->Caption = ""; statusBar->SimpleText = "nicht verbunden"; // Falls der Debugmode aktiviert ist, eine Anzeige ausgeben if(iDebug == 1) { memoDebug->Lines->Add("Debugmodus aktiviert!"); } // Browser mit den Patchnotes verbinden BrowserNews->Navigate2(TVariant("http://192.168.0.3/zdd/patchnotes.php"), NULL, NULL, NULL, NULL ); // Fortschritssanzeige anpassen SendMessage(barDatei->Handle, PBM_SETBARCOLOR, 0, clRed); // Auslesen der installierten HAK-Version String ZdDVersion = "Software\\ZdD"; HKEY rHandleZdDVersion; long rOpenZdDVersion = RegOpenKeyEx(HKEY_LOCAL_MACHINE, ZdDVersion.c_str(), NULL, KEY_ALL_ACCESS, &rHandleZdDVersion); if (rOpenZdDVersion != ERROR_SUCCESS) { ShowMessage("Error: KeyHAK"); return; } DWORD dwData1 = 256; BYTE bData1[256] = ""; String sVersion = "Version"; String sVersionValue = ""; if (RegQueryValueEx(rHandleZdDVersion, sVersion.c_str(), 0, 0, bData1, &dwData1)==ERROR_SUCCESS) { for (DWORD i=0; i<dwData1; i++) sVersionValue = sVersionValue + (char)bData1[i]; // Installierte Version speichern (für Vergleichsfunktionen) fInstalledHAKVersion = StrToFloat(sVersionValue); // Text für Label generieren sVersionValue = "Installierte HAK Version: " + sVersionValue; lblInstalledVersion->Caption = sVersionValue; } else ShowMessage("Installierte ZdD-HAKs nicht gefunden!!"); // Registry Schlüssel schließen RegCloseKey(rHandleZdDVersion); // Selbe Funktion noch mal für NWN Path!! String BioNWNPath = "Software\\BioWare\\NWN\\Neverwinter"; HKEY rHandleNWNPath; long rOpenNWNPath = RegOpenKeyEx(HKEY_LOCAL_MACHINE, BioNWNPath.c_str(), NULL, KEY_ALL_ACCESS, &rHandleNWNPath); if (rOpenNWNPath != ERROR_SUCCESS) { ShowMessage("Error: KeyPath"); return; } DWORD dwData = 256; BYTE bData[256] = ""; String NWNPath = "Location"; String NWNPathValue = ""; if (RegQueryValueEx(rHandleNWNPath, NWNPath.c_str(), 0, 0, bData, &dwData)==ERROR_SUCCESS) { for (DWORD i=0; i<dwData; i++) NWNPathValue = NWNPathValue + (char)bData[i]; // Verzeichnis speichern sNWNPfad = NWNPathValue; // Text für Label generieren NWNPathValue = "NWN Pfad: " + NWNPathValue; lblNWNPath->Caption = NWNPathValue; } else { ShowMessage("Neverwinter Nights nicht gefunden!"); //btnStartPatch->Enabled = false; }// Registry Schlüssel schließen RegCloseKey(rHandleNWNPath); } //--------------------------------------------------------------------------- void __fastcall TFormMain::btnStartPatchClick(TObject *Sender) { FTPClient->Connect(); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- void __fastcall TFormMain::FTPClientConnect(TObject *Sender) { // Statusbar anpassen (Verbunden mit IP) statusBar->SimpleText = "verbunden mit "+FTPClient->RemoteIP; // Unterverzeichnisse des Root-Directory lesen FTPClient->List(); // Verzeichnisse im Debugfenster anzeigen (Ergebnis von List) memoDebug->Lines = FTPClient->FTPDirectoryList->name; // Verzeichnisse zählen int i = memoDebug->Lines->Count - 1; int x = 0; while(x <= i) { // Namen des Ordners einlesen AnsiString sOrdner = FTPClient->FTPDirectoryList->name->Strings[x]; // Ordnernamen in Float konvertieren // .. abfangen if(sOrdner == ".."){ } // nichts tun else { // Floatwert zuweisen fDir = StrToFloat(sOrdner); if(iDebug == 1) { memoDebug->Lines->Add("Patch "+sOrdner); } } // Falls der Ordnerwert größer als der Wert in der lokalen Registry ist... if(fInstalledHAKVersion < fDir) { lblStatus->Caption = "Neue Version gefunden!"; // In das Verzeichnis wechseln FTPClient->ChangeDir(sOrdner); if(iDebug == 1) { memoDebug->Lines->Add("Verzeichnis geändert auf "+FTPClient->CurrentDir); } // Verzeichnisinhalt auslesen FTPClient->List(); iListPatchFiles = 1; // Namen der Datei einlesen AnsiString sDatei = FTPClient->FTPDirectoryList->name->Strings[2]; // Testdownload AnsiString sZiel; sZiel = sNWNPfad+"\\"+sDatei; if(iDebug == 1) { memoDebug->Lines->Add("Zielverzeichnis: "+sNWNPfad); memoDebug->Lines->Add("sDatei: "+sDatei); memoDebug->Lines->Add("generiert: "+sZiel); } //FTPClient->Download(sDatei, sDownload); } x++; } //Debug->Lines->Add("HAK: "+FloatToStr(fInstalledHAKVersion)); } //--------------------------------------------------------------------------- void __fastcall TFormMain::FTPClientListItem(AnsiString Listing) { if(iListPatchFiles = 1) { /*if(iDebug == 1) { memoDebug->Lines = FTPClient->FTPDirectoryList->name; } */ } } //---------------------------------------------------------------------------
Unit1.h
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <Menus.hpp> #include <ComCtrls.hpp> #include <IdBaseComponent.hpp> #include <IdComponent.hpp> #include <IdFTP.hpp> #include <IdTCPClient.hpp> #include <IdTCPConnection.hpp> #include <NMFtp.hpp> #include <Psock.hpp> #include <winreg.h> #include "SHDocVw_OCX.h" #include <OleCtrls.hpp> #include <ExtCtrls.hpp> #include <SysUtils.hpp> //--------------------------------------------------------------------------- class TFormMain : public TForm { __published: // Von der IDE verwaltete Komponenten TMainMenu *menuMain; TMenuItem *D1; TMenuItem *Beenden1; TLabel *lblInstalledVersion; TButton *btnStartPatch; TMemo *memoDebug; TProgressBar *barDatei; TLabel *lblTransfer; TLabel *lblProzent; TMenuItem *Einstellungen1; TMenuItem *Proxy1; TMenuItem *Debug1; TMenuItem *Hilfe1; TMenuItem *ber1; TMenuItem *Patchvorgangstarten1; TStatusBar *statusBar; TNMFTP *FTPClient; TLabel *lblStatus; TCppWebBrowser *BrowserNews; TImage *Image1; TLabel *lblNWNPath; void __fastcall Beenden1Click(TObject *Sender); void __fastcall FormCreate(TObject *Sender); void __fastcall btnStartPatchClick(TObject *Sender); void __fastcall FTPClientConnect(TObject *Sender); void __fastcall FTPClientListItem(AnsiString Listing); void __fastcall FormShow(TObject *Sender); private: // Anwender-Deklarationen public: float fInstalledHAKVersion; // ZdD Version AnsiString sVersion; // Programmversion char SystemDecimalSeparator; // Dezimaltrennzeichen float fDir; // Verzeichnisname (FTP) AnsiString sNWNPfad; // NWN Verzeichnis int iListPatchFiles; // Statusvariable für das auslesen der Dateien nach einem CWD int iDebug; // DebugMode (1 = aktiviert, 0 = deaktiviert) // Anwender-Deklarationen __fastcall TFormMain(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TFormMain *FormMain; //--------------------------------------------------------------------------- #endif
Hilfe!
-
und was steht in "sDatei" kurz vor dem verketten drin?
-
In sDatei steht test.txt
-
Ich habe eben mal einen Breakpoint gesetzt um ganz ganz sicher zu gehen, was in den Vars drinsteht.
Also:
sNWNPfad = "c:\\temp"
sDatei = "test.txt"
sZiel = "c:\\temp"Mich wunder halt, dass er bei der Zuweisung der Werte zu sZiel einfach den Inhalt von sDatei ignoriert! Irgendwie komme ich mir gerade sehr dumm vor ...
Edit:
Ich habe eben mal sNWNPfad = "c:\\temp"; anstatt sNWNPfad=sNWNPathValue gemacht und es funktioniert korrekt. Nur warum? NWNPathValue ist auch ein String und wenn ich ihn mir anzeigen lasse, hat er "c:\\temp" als Inhalt. Harte Sache!Nur ist es ja wichtig, dass dieser Pfad aus der Registry gelesen wird!! Was mach ich da denn jetzt? Weiß jemand einen "Workaround" ?
Edit2:
Ich habe das Problem gelöst. Man soll nicht aus der Registry lesen, wenn man die Funktion dazu nicht 100%ig versteht
Ich habe zum Auslesen der Werte nun anstatt WinAPI TRegistry verwendet. Unter den Tutorials war das ja ausführlich beschrieben (okay, hat 30 Minuten gedauert bis es wirklich klappte), aber immerhin. Der neue Teil zum Auslesen der Werte sieht nun so aus:// Auslesen der ZdD HAK Version aus der Registry TRegistry *HAKVersion; HAKVersion = new TRegistry; HAKVersion->RootKey = HKEY_LOCAL_MACHINE; HAKVersion->OpenKey("SOFTWARE\\ZdD\\",false); // Installierte Version speichern (für Vergleichsfunktionen) fInstalledHAKVersion = StrToFloat(HAKVersion->ReadString("Version")); // Text für Label generieren lblInstalledVersion->Caption = "Installierte HAK Version: " + HAKVersion->ReadString("Version"); // Auslesen des NWN Installationsverzeichnisses aus der Registry TRegistry *NWNPath; NWNPath = new TRegistry; NWNPath->RootKey = HKEY_LOCAL_MACHINE; NWNPath->OpenKey("SOFTWARE\\Bioware\\NWN\\Neverwinter\\",false); // NWN Verzeichnis einer Variable zuweisen sNWNPfad = NWNPath->ReadString("Location"); // Label beschriften lblNWNPath->Caption = "NWN gefunden in: "+sNWNPfad;
sZiel wird nun korrekt zusammengesetzt. Werde mich jetzt an die "Abfangfunktionen" machen. Trotzdem Danke an alle Helfer!
Gruß