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ß


Anmelden zum Antworten