[C++] Benutzervariable & Verknüpfung erstellen

iNstinct

Mitglied
Hi Leute.

Ich habe ein Problem. Ich muss mit einem C++ Programm eine Umgebungsvariable setzen (Benutzervariable) und dann eine Verknüpfung erstellen, in der die Variable vorkommt.

Die Verknüpfung wäre dann: perl.exe "%Variable%\..."

Mein Programmcode sieht bislang so aus:

Code:
#include <string>
#include <stdlib.h>
#include <vcl.h>
#pragma hdrstop
#include "SetEnv.h"

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if(Variable->Caption == "" || Variable->Caption == "Variable"){
    Error->Caption = "No Variablename set!";
  }
  else if(Value->Caption == "" || Value->Caption == "Variable"){
    Error->Caption = "No Variablevalue set!";
  }
  else{
    SetEnvironmentVariable(Variable->Caption, Value->Caption);
  }
}

Nun gibt es aber schon früher Probleme.

"Zugriff auf TControl::Caption nicht möglich!" kommt bei der Compilierung.

Brauche dringend Hilfe und danke schon einmal im Voraus ;)
 
Ich habe hier kein Borland (was du ja scheinbar verwendest) und es ist schon eine Weile her, daß ich damit gearbeitet habe.
Ist Caption eine Membervariable oder eine Funktion von TControl?
Wenn es eine Funtion ist, dann hast Du die Klammern vergessen.
Wenn es eine Membervariable ist, ist sie dann vielleicht private oder protected und du mußt den Wert über eine Funktion (z.B. GetCapture() oder so) abfragen?
 
also die syntax stimmt (um cpation).
bei meinen ganzen anderen programmen geht das ja auch.
ansonsten glaube ich einfach nur, dass borland (mal wieder) keinen bock hat ;)


wie sieht es mit der verknüpfung und benutzervariable aus? das wär mir eigentlich das wichtigste.
mit SetEnvironmentVariable("",""); ging es bei mir nicht...
 
Hi.

SetEnvironmentVariable wirkt sich nur auf den aktuellen Prozess und evtl. auch auf Kind-Prozesse aus. Es hat keine Wirkung auf System-Variablen.

Systemvariablen kannst du zum Registry Schlüssel HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment hinzufügen.

Gruß
 
danke deep.

nun aber das nächste problem.

wie bekomme ich aus einem textfield den wert als string?
 
Zuletzt bearbeitet:
Hi.

Also entweder du verdoppelst alle Backslashes nochmal, d.h. aus "c:\\abc\\" wird "c:\\\\abc\\\\" oder - das mach ich immer so - du verwendest einfach normale Slashes "c:/abc/". Das ist besser lesbar und hat keine unerwarteten Nebenwirkungen (z.B. wenn man mal ein Backslash vergisst und da eine Escape-Sequenz wie \n \t o.ä. herauskommt)

Gruß
 
das hab ich jetzt hinbekommen. siehe neue frage ;)
zudem ein neues problem:

Code:
CopyFile("D://EasyHip//EasyHip.lnk" , "C://Documents and Settings//%USERNAME%//SendTo//hip.lnk" , TRUE);
  Error->Caption = "Shortcut copied\nVariable added";

So sollte eine Datei kopiert werden. aber die " " zwischen Documents and Settings werden nicht übernommen und der benutzername auch nich ausgelesen
 
Die einfachen Schrägstriche brauchst du nicht verdoppeln.

Die Variablen werden nur vom Kommando-Prozessor expandiert - es werden nicht in jedem Parameter einer beliebigen Funktion Umgebungsvariablen ersetzt.

D.h. um das zu erreichen was du willst müßtest du die den copy Befehl über eine Kommondazeile aufrufen.

Andererseits kannst du dir natürlich auch schnell eine Funktion schreiben die eine solche Ersetzung durchführt.

Gruß
 
Code:
#include <stdlib.h>
#include <windows.h>
#include <vcl.h>
#pragma hdrstop
#include "SetEnv.h"

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ShellExecute(NULL, "open", "hip.bat", "", NULL, SW_SHOW);
  char feld;
  feld = char(Value->Text);
  HKEY hkey;
  HKEY KEY = HKEY_CURRENT_USER;
  char place[100]= {"Environment"};
  char name[100]= {"EasyHipSend2"};
  char value[100]= {feld};

  RegOpenKeyEx(KEY,(LPCTSTR)place,0, KEY_ALL_ACCESS,&hkey);
  RegSetValueEx(hkey, name, 0, REG_SZ, (BYTE *)feld, strlen(value));
  RegCloseKey(hkey);

  Error->Caption = "Shortcut copied\nVariable added\n\n\n\n" + feld;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::onload(TObject *Sender)
{
  Label2->Caption = "Directory:\nThe EasyHip directory";        
}
//---------------------------------------------------------------------------



char feld;
feld = char(Value->Text);
char value[100]= {feld};

Die Zeilen machen mir nun noch Probleme
 
Zuletzt bearbeitet:
Zurück