ERLEDIGT
JA
JA
ANTWORTEN
25
25
ZUGRIFFE
4486
4486
EMPFEHLEN
-
Hallo zusammen,
ich arbeite grad an meiner Thesis und habe folgendes Problem:
Ich schreib grad an einem COM InProc Server in Form einer dll, es inzwischen wunderbar und jetzt geht es um das drum herum
Ich hab als Thema mit angegeben ein update Tool zu schreiben welches sich um die Verwaltung der verschiedenen Versionen kümmert.
Die dll ist selbstregistrierend, dass heißt er lässt sich automatisch mit "regsvr32 *.dll" in die Registry eintragen!
Aber ich hätte gern ein visuelles Tool welches welches einen Ordner mit allen verfügbaren Modulen beinhaltet, welche dann in einer Listbox zu Auswahl gelistet werden...
Im Prinzip muss der COM Server nur einmal registriert werden und dann immer nur die jeweilige dll ersetzen. Ich denke der "system32" Ordner ist der richtige Ort dafür!
Ich werde jetzt Anfangen ein Dialogfeldbasiertes Programm zu erstellen, aber meine Frage ist:
Wie kann ich Dateien hin und her kopieren und ersetzen und wie kann ich den regsvr32 mit Parametern aus dem Dialogprog heraus aufrufen?
Konsolen anwendung?
Man sieht ja oft bei Installationsroutinen, dass Dos fenster aufgehen...
Würde mich über jede Art von Hilfe freuen
Vielleicht n ganz anderer Weg?
Danke im Vorraus und
Grüße
RuFF
-
Den "regsvr32" Befehl aufzurufen ist schon ein guter Weg. Bei Windows Programmen bietet sich da die Verwendung der Funktion "CreateProcess()" an. Ein Thread zu dieser Sache gab's gerade im Forum, siehe hier.
Regsvr32 läßt sich mit dem Parameter "/s" im silent mode ausführen, d.h es erscheinen dann keine Fenster.
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
@ MCoder
Vielen Dank für die schnelle Antwort und sorry für die späte Antwort meinerseits, hab ne Menge Stress im Moment!
Whatever, so hab ich mir das ganze auch vorgestellt nur dass ich regsvr32 nur so kenne, dass man in der Eingabeaufforderung in den jeweiligen Ordner geht in dem sich die dll befindet und von dort aus den befehl aufruft...
Würde es auch funktionieren, wenn ich regsvr32 als Parameter den kompletten Pfad der dll übergebe?
Werde es einfach ausprobieren...
Nur muss ich erstmal soweit kommen regsvr32 auf zu rufen
Weil ich steh erstmal vor dem Problem, dass ich die dll in den system32 Ordner kopieren muss.
Ich weiß gar net wie man Dateien kopiert, bzw. wenn schon vorhanden diese überschreibt...
Gibts bestimmt ne schöne Klasse zu die ich mal wieder nicht kenne
Aber ich denke das wird schon mit der Zeit *g*
Danke im Vorraus und Grüße
RuFF
Und da hab ich gleich nochmal eine Frage, wie kann ich ohn e verwalteten Code zu benutzen die Version einer dll ermitteln?
Ich würde gerne dem benutzer anzeigen welche Version bereits installiert ist...
Aber das ist eher optional, wichtiger ist es die Daten erstmal zu kopieren und
mit CFileFind kann ich mir ja das Erstellungs datum holen und vergleichen...
Aber wäre halt schön dem benutzer das noch anzeigen zu können
Geändert von RuFFnEcK (06.03.06 um 14:32 Uhr)
-
Hallo ich nochmal,
jetzt nochmal die Fragestellung klar formuliert:
Ich muss Dateien kopieren und ersetzen.
Hab dafür die Methode CopyFile gefunden, die sich aber wehement dagegen wehrt eine test.txt Datei zu kopieren und liefert immer false zurück...
Hab schon mehrere Arten die Verzeichnisse anzugeben probiert...
Code :1
bool returnValue = CopyFile((LPCTSTR)"C:\\Programme\test.txt", (LPCTSTR)"C:\\temp", false);
Es existiert zum einen die Datei und der Ordner "temp" ebenso.
Was mach ich falsch?
-
06.03.06 16:34 #5
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
Hi.
Der Backslash ist ein Spezialzeichen welches eine besondere Bedeutung hat. Um es in einem String zu verwenden mußt du es durch einen weiteren Backslash entschärfen. Für ein Backslash gefolgt von einem t wird ein Tab Zeichen eingesetzt.
Oder du verwendest einfach immer normale Schrägstriche - das funktioniert auch (und ist nicht so fehleranfällig).
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Salut,
ja ich weiß, weil ich soviel dran rumgespielt hab fehlt da an der Stelle ein "\".
Hab glaub ich jetzt schon alles ausprobiert...
sowohl "/" als auch "\\" oder "\"
Hab auch versucht nen DAteinamen mit an zu geben:
Code :1
bool returnValue = CopyFile("(LPCTSTR)C:\\Programme\\test.txt", (LPCTSTR)"C:\\temp\\test.txt", false);
Auch das funktioniert nicht
Ich werd hier langsam gagga, sitzt hier getz seit stunden an dem prob
Aber das kann doch net so schwer sein.
Sonst noch ne Idee woran es liegen könnte?
Grüße
RuFF
EDIT:
Ich habe es jetzt hinbekommen
Hier die korrekte lauffähige Version:
Code :1
bool returnValue = CopyFile("C:\\Programme\\test.txt", "C:\\temp\\test.txt", false);
Mensch ich hab da getz stunden mit verbracht *heul*
Aber jetzt es ja
Danke für die Antwort
Grüße RuFFGeändert von RuFFnEcK (06.03.06 um 16:55 Uhr)
-
06.03.06 16:48 #7
- Registriert seit
- Jun 2005
- Beiträge
- 8.169
Außer das du jetzt das (LPCTSTR) mit in den String reingeschrieben hast...
Ruf mal nach der Funktion GetLastError auf und schau was da raus kommt, da weißt du dann warum es nicht funktioniert.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Die Idee GetLastError() aufzurufen hatte ich auch schon, aber ich wusste nicht wie...
Hab oben editiert grad, also hat ge****t
Danke für die schnelle Antwort.
Grüße RuFF
EDIT:
Habs grad gesehen dass ich echt den (LPCTSTR) mit in den String gepackt hatte
Tja wenn ich verzweifel schau ich irgendwie nciht mehr richtig hin
Aber gottseidank hat es ge****t *g*
Grüße
-
Natürlich würde das auch funktionieren. Du kannst ja mal regsvr32 im DOS-Fenster ohne Parameter aufrufen. Dann werden dir die Befehlssyntax und die verfügbaren Parameter angezeigt.
Zitat von RuFFnEcK
Da könntest du vielleicht mal einen Blick auf diesen Artikel werfen.
Zitat von RuFFnEcK
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
Hab mal ganz Zufällig einen Blick auf den Artikel geworfen und ganz zufällig mir ganz schnell den Code kopiert und eingefügt, aber noch nicht richtig hingeschaut
Zitat von MCoder

Ist wohl genau das was ich gesucht hab
Vielen Dank, werde es bei gelegenheit mal direkt antesten.
Mit dem regsvr32 hab ich hinbekommen und wunderbar
Auch hier vielen Dank an dich.
Werde mich erstmal mit dem verfassen wissenschaftlicher Arbeiten beschäftigen müssen
Das unschönste an solch einer Arbeit, aber da muss ich wohl auch durch
Aber keine Frage ich komme wieder mit tausend Fragen *g*
Grüße RuFF
-
Hallo ich nochmal

Also ich hab das mal eingebaut und es funktioniert bis zu diesem Punkt:
Da bekomme ich einen NULL Zeiger zurück was bedeutet dass die dll das hier nicht unterstützt:Code :1 2
pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst, TEXT("DllGetVersion"));
Es handelt sich bei mir nicht um eine gewöhnliche dll sondern um einen COM InProc Server,DLL supports version retrieval function
"verpackt" als dll.
Jedoch kann ich im Explorer unter Versions Info alle Einträge einsehen die ich unter Visual Studio gemacht habe...
Hast du ne Idee wie es sonst noch gehen würde
Grüße RuFF
-
Ich glaube, der von mir gepostete Link war nicht so toll, da er nur mit DLLs funktioniert, die die Funktion "DllGetVersion" implementiert haben.
Versuch's mal mit nachfolgendem Code, den ich selber auch verwende (hatte ich bloß gestern abend nicht parat). Maßgeblich ist "GetVersionProperty()", "GetLanguage()" ist nur eine Hilfsfunktion. Ich hoffe, der Funktionskopf ist genügend selbsterklärend.
Gruß
MCoder
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
//------------------------------------------------------------------- // Versionsinfos einer Datei auslesen //------------------------------------------------------------------- // Parameter // pszPath ... Dateiname mit vollständigem Pfad // sRet ... CString für Ergebnis // pProperty ... Eigenschaft: // CompanyName // FileDescription // FileVersion // InternalName // LegalCopyright // OriginalFilename // ProductName // ProductVersion // Comments // LegalTrademarks // PrivateBuild // SpecialBuild // Return TRUE/FALSE //------------------------------------------------------------------- BOOL GetVersionProperty(LPCTSTR pszPath, CString& sRet, LPCTSTR pProperty) { TCHAR *lpVersion; DWORD dwVerInfoSize; DWORD dwVerHnd; BOOL bRetCode; TCHAR tchGetName[1024]; UINT wVersionLen; WORD wLanguage, wCodePage; if( !GetLanguage(pszPath, wLanguage, wCodePage) ) { return FALSE; } _stprintf(tchGetName, _T("\\StringFileInfo\\%04x%04x\\"), wLanguage, wCodePage); _tcscat(tchGetName, pProperty); dwVerInfoSize = GetFileVersionInfoSize((LPTSTR)pszPath, &dwVerHnd); if (dwVerInfoSize) { TCHAR *lpstrVffInfo; HANDLE hMem; // allocate memory to hold the verinfo block hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize); lpstrVffInfo = (TCHAR FAR*)GlobalLock(hMem); GetFileVersionInfo((LPTSTR)pszPath, 0L, dwVerInfoSize, lpstrVffInfo); bRetCode = VerQueryValue((LPVOID)lpstrVffInfo, (LPTSTR)tchGetName, (void FAR* FAR*)&lpVersion, (UINT FAR *) &wVersionLen); if( bRetCode && wVersionLen && lpVersion) { sRet = lpVersion; } else { GlobalUnlock(hMem); GlobalFree(hMem); return FALSE; } GlobalUnlock(hMem); GlobalFree(hMem); } else { return FALSE; } return TRUE; } //------------------------------------------------------------------- // Sprachversion ermitteln //------------------------------------------------------------------- // Parameter pszPath ... Dateiname mit vollständigem Pfad // wLanguage ... Sprache // wCodePage ... Codepage // // RETURN TRUE/FALSE //------------------------------------------------------------------- BOOL GetLanguage(LPCTSTR pszPath, WORD& wLanguage, WORD& wCodePage) { LANGANDCP FAR *lpTrans; DWORD dwVerInfoSize; DWORD dwVerHnd; UINT wNum; UINT wRetCode = 0; BOOL bRet = TRUE; if( _taccess(pszPath, 0) == (-1) ) { return FALSE; } dwVerInfoSize = GetFileVersionInfoSize((LPTSTR)pszPath, &dwVerHnd); if( dwVerInfoSize ) { LPSTR lpstrVffInfo; HANDLE hMem; // allocate memory to hold the verinfo block hMem = GlobalAlloc(GMEM_MOVEABLE, dwVerInfoSize); lpstrVffInfo = (char FAR*)GlobalLock(hMem); GetFileVersionInfo((LPTSTR)pszPath, 0L, dwVerInfoSize, lpstrVffInfo); if( VerQueryValue((LPVOID)lpstrVffInfo, _T("\\VarFileInfo\\Translation"), (void FAR* FAR*)&lpTrans, (UINT FAR*)&wNum) ) { wLanguage = lpTrans->wLanguage; wCodePage = lpTrans->wCodePage; } else { bRet = FALSE; } GlobalUnlock(hMem); GlobalFree(hMem); } else { return FALSE; } return bRet; }"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
-
Hallöchen,
erstmal vielen Dank an dich
Aber wie zu erwarten hab ich da das eine oder andere Problemchen mti den beiden Funktionen...
Zum einen wer oder was ist "LANGANDCP FAR" in der Funktion "GetLanguage()" ?
Hab nix dazu gefunden, selbst google spuckt nur einen Treffer aus wenn man nach "LANGANDCP " sucht...
Und zum anderen eine Verständnisfrage zur Funktion "GetVersionProperty(LPCTSTR pszPath, CString& sRet, LPCTSTR pProperty)"
Scheinbar erwartet die Funktion diesen Parameter "LPCTSTR pProperty" von mir aber ich weiß net was da rein soll...
Vielmehr will ich nach der Beschreibung des Parameters zu urteilen eben diese Infos haben und nicht ihm übergeben
Grüße RuFF
-
Hiilfe
Habs eingebaut und würde denk ich , nur brauch ich folgendes:
- Definition von:
Code :1
LANGANDCP
- Verwendung des Übergabeparameters pProperty in der Funktion:
Ich versteh hierbei nicht warum Übergabeparameter und nicht Rückgabeparameter...Code :1
BOOL GetVersionProperty(LPCTSTR pszPath, CString& sRet, LPCTSTR pProperty)
Danke im Vorraus
Grüße
RuFF
-
Sorry, hab leider das zugehörige typedef vergessen:
Zitat von RuFFnEcK
Code :1 2 3 4 5
typedef struct tagLANGANDCP { WORD wLanguage; WORD wCodePage; } LANGANDCP;Einfach als String übergeben, z.B.: GetVersionProperty("CompanyName", ...
Zitat von RuFFnEcK
Der Rückgabeparameter ist schon reserviert, um zu signalisieren, ob's überhaupt geklappt hat. Daher wird der ermittelte Wert dann in "sRet" geschrieben, der übergeben wird.
Zitat von RuFFnEcK
Ich hoffe, ich habe alle Klarheiten beseitigt
Gruß
MCoder"The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
--- Larry Wall
Ähnliche Themen
-
DLL mitgeben aber nicht registrieren?
Von DrMueller im Forum .NET Application und Service DesignAntworten: 0Letzter Beitrag: 18.12.09, 11:46 -
Registrieren einer server web control, kann es nicht, helft Ihr bitte
Von Kai_Jack im Forum .NET Windows FormsAntworten: 5Letzter Beitrag: 26.06.06, 19:10 -
FTP-Server! aber welcher?
Von FingerSkill im Forum Linux & UnixAntworten: 3Letzter Beitrag: 14.03.06, 01:23 -
Email server Aber Wie ?!
Von Florianrau im Forum Hosting & WebserverAntworten: 3Letzter Beitrag: 31.03.05, 18:06 -
Server installieren, aber wie?
Von ea- im Forum Linux & UnixAntworten: 1Letzter Beitrag: 26.12.01, 11:08





Zitieren
Login






