Installationsverzeichniss aus der Registry

OliWan

Mitglied
...hi Coders!:)

ich suche mal wieder Hilfe bei einem - so glaube ich- Standarproblem.

Ich Rufe aus meinem C# Prog einige lokale Dateien auf z.b. c:\progdir\grafik.jpg

Nun will ich aber nicht die Grafik auf diese Weise - also mit absolutem Verzeichnisbaum anlegen - Denn wenn der User das Prog in c:\anderesdir\ installiert hat, läuft mein Prog auf einen Fehler.

So hab ich mir gedacht, ich könnte mit der ProgID die Registry nach dem
Installationsverzeichnis durchsuchen - nur leider hab ich keine Ahnung wie das geht.

Hat jemand von euch sowas schon gemacht und kann mir mit einem Code-Snippet auf die Beine helfe - oder gibt es für dieses Dilemma noch einen anderen Weg?:rolleyes:

Hope for help and may the force be with you
 
Warum versuchst du es nicht mit dem Verzeichnis deiner Anwendung?

datei = Application.StartupPath.ToString() + "\\grafik.jpg";

Wenn die Grafikdatein im selben Verzeichnis liegen wie die ausgeführte Anwendung sollte es super klappen...

MfG Scherbe
 
Hi Schwerbe,

danke für den TIPP - nur leider wird mein Form von einer vorgelagerten Applikation aufgerufen, die in einem ganz anderem Verzeichnis liegt.
Application.getStartPath() liefert das Verzeichnis dieser Applikation zurück und
nicht die meines Forms ;-(

... gibt's da auch einen Weg - habs mit Form.getStartPaht() probiert-bringt
aber ne Fehlermeldung

Erik - relative Verzeichnisbezeichnung kannst du mir ein Beispiel geben? Ich hab nur ne Ahnung was du meinst :-(

OliWan

-----
may the force be with you
 
Relative Pfade bedeuten folgendes:

Wenn du aus deiner Anwendung nur 'grafik.jpg' aufrufst, wird nach 'grafik.jpg' im aktuellen Verzeichnis gesucht. Du musst nicht den kompletten Namen es Verzeichnisses angebene wie 'C:\dad\daudsa\prog\grafik.jpg'.

Wenn du 'unterordner\grafik.jpg' angibst, wird in dem unterordner des aktuellen verzeichnisses nach der grafik gesucht. Somit ist es egal wo das Programm installiert ist, wenn die Datei vom Pfad des Programms aus gesehen immer an der gleichen Stelle liegt.
 
mmmh - dumm ist dabei,

dass das current directory immer c:\windows\system32\ ist und nicht
das Verzeichnis in dem die dll installiert wurde.

Ich bin nicht sicher, aber da die Klasse instanziert wird, ist der Speicherort nicht
mehr errechbar - zumindes kenne ich keinen Weg ;-(

Deswegen dacht ich , ich frag nach der hinterlegten URL für die ProgID und schon weis ich wo die Grafiken liegen.... nur hab ich keine Ahnung, wie man die
hinterlegte URL zu einer ProgID abfragt....


OliWan

---
help me ObiWan - you're my last hope
 
Hallo.

Wenn du es über die Registry machen willst, musst du auch wohl oder übel das Programm mittels Setup am PC installieren, damit der richtige Ordner in der Registry steht.
Geht aber auch anders.

Du musst nur an eine Assembly-Instanz von einer deiner Assemblys kommen, und mittels Location-Property kannst dann weitermachen.

Code:
using System;
using System.Reflection;
using System.IO;

class test
{
	public static void Main()
	{	
		Assembly asm = Assembly.GetExecutingAssembly();
		Console.WriteLine("loc: " + asm.Location);
		
		FileInfo fi = new FileInfo(asm.Location);
		Console.WriteLine("dir: " + fi.DirectoryName);
	}
}

Eine weitere Möglichkeit wie du ans Assembly kommst ist die statische Methode GetAssembly der Assembly Klasse.


MfG,
Alex
 
Hi Schuc,

ja das stimmt schon mit dem Setup!

Da ich die Assemblie eh mit regasm / gacutil registrieren muß,

jage ich nun den Abfrage durch TypeLib in der Registry - hier
ist der Code für alle die ein ähnliches Problem mal haben -

Ach ja - Coders-Profs - wenn ich den Code noch sauberer machen kann, dann
schickt mir bitte eure Tipss - Danke für eure Postings! :)

Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.Registry.LocalMachine;
Microsoft.Win32.RegistryKey software = hklm.OpenSubKey("SOFTWARE");
Microsoft.Win32.RegistryKey clas = software.OpenSubKey("Classes");
Microsoft.Win32.RegistryKey ads = clas.OpenSubKey("TypeLib");
Microsoft.Win32.RegistryKey oKey=null;
Microsoft.Win32.RegistryKey oKey1=null;

string [] sProvNames = ads.GetSubKeyNames();
string nam =null;
foreach (string Keyname in sProvNames)
{
int iPos = Keyname.IndexOf("{");
string[] valNames;
string echtname;
if (iPos>-1){
valNames = ads.OpenSubKey(Keyname).GetSubKeyNames();
echtname=Keyname;
}else{
valNames = ads.OpenSubKey(@"{"+Keyname+@"}").GetSubKeyNames();
echtname=@"{"+Keyname+@"}";
}
foreach(string valname in valNames){

if (valname=="1.0") <- Ich Suche nach Version 1.0

if (ads.OpenSubKey(echtname+@"\1.0").GetValue("").ToString()=="csExample"){

csExample so lt. mein Namespace

path=ads.OpenSubKey(echtname+@"\1.0\HELPDIR").GetValue("").ToString();
break;
}
}
if (path!=null){
break;
}
}

Gruß OliWan

---------------------
may the force be with you



return path;

}
catch
{
return null;
}

}
 
Hi.

1) Bitte nenne mich nicht Schuc. Wenn du schon mit dem Nachnamen anreden willst, Herr Schuc, Fräulein Schuc, oder so. Aber ohne etwas davor klingts sehr komisch. Am Liebsten wäre mir allerdings noch immer die Kurzform meines Vornamens. Alex. Danke.

2) Bitte formatiere deinen Source-Code und benutz Code-Tags.

Danke,
Alex
 
Sorry Alex,

war net so jemeint!

Gruß OliWan

Code:
Microsoft.Win32.RegistryKey hklm = Microsoft.Win32.Registry.LocalMachine;
Microsoft.Win32.RegistryKey software = hklm.OpenSubKey("SOFTWARE");
Microsoft.Win32.RegistryKey clas = software.OpenSubKey("Classes");
Microsoft.Win32.RegistryKey ads = clas.OpenSubKey("TypeLib");
Microsoft.Win32.RegistryKey oKey=null;
Microsoft.Win32.RegistryKey oKey1=null;

string [] sProvNames = ads.GetSubKeyNames();
string nam =null;
foreach (string Keyname in sProvNames)
{
int iPos = Keyname.IndexOf("{");
string[] valNames;
string echtname;
if (iPos>-1){
valNames = ads.OpenSubKey(Keyname).GetSubKeyNames();
echtname=Keyname;
}else{
valNames = ads.OpenSubKey(@"{"+Keyname+@"}").GetSubKeyNames();
echtname=@"{"+Keyname+@"}";
}
foreach(string valname in valNames){

if (valname=="1.0") <- Ich Suche nach Version 1.0 

if (ads.OpenSubKey(echtname+@"\1.0").GetValue("").ToString()=="csExample"){ 

csExample so lt. mein Namespace

path=ads.OpenSubKey(echtname+@"\1.0\HELPDIR").GetValue("").ToString();
break;
}
}
if (path!=null){
break;
}
}

return path;

}
catch
{
return null;
}

}
 
Zurück