tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
25
ZUGRIFFE
4486
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    RuFFnEcK RuFFnEcK ist offline Mitglied Gold
    Registriert seit
    Jan 2004
    Beiträge
    203
    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
     

  2. #2
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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

  3. #3
    RuFFnEcK RuFFnEcK ist offline Mitglied Gold
    Registriert seit
    Jan 2004
    Beiträge
    203
    @ 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)
     

  4. #4
    RuFFnEcK RuFFnEcK ist offline Mitglied Gold
    Registriert seit
    Jan 2004
    Beiträge
    203
    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?
     

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  6. #6
    RuFFnEcK RuFFnEcK ist offline Mitglied Gold
    Registriert seit
    Jan 2004
    Beiträge
    203
    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 RuFF
    Geändert von RuFFnEcK (06.03.06 um 16:55 Uhr)
     

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  8. #8
    RuFFnEcK RuFFnEcK ist offline Mitglied Gold
    Registriert seit
    Jan 2004
    Beiträge
    203
    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
     

  9. #9
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von RuFFnEcK
    Würde es auch funktionieren, wenn ich regsvr32 als Parameter den kompletten Pfad der dll übergebe?
    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 Zitat von RuFFnEcK
    Und da hab ich gleich nochmal eine Frage, wie kann ich ohn e verwalteten Code zu benutzen die Version einer dll ermitteln?
    Da könntest du vielleicht mal einen Blick auf diesen Artikel werfen.

    Gruß
    MCoder
     
    "The three chief virtues of a programmer are: Laziness, Impatience and Hubris."
    --- Larry Wall

  10. #10
    RuFFnEcK RuFFnEcK ist offline Mitglied Gold
    Registriert seit
    Jan 2004
    Beiträge
    203
    Zitat Zitat von MCoder
    Da könntest du vielleicht mal einen Blick auf diesen Artikel werfen.

    Gruß
    MCoder
    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

    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
     

  11. #11
    RuFFnEcK RuFFnEcK ist offline Mitglied Gold
    Registriert seit
    Jan 2004
    Beiträge
    203
    Hallo ich nochmal

    Also ich hab das mal eingebaut und es funktioniert bis zu diesem Punkt:

    Code :
    1
    2
    
    pDllGetVersion = (DLLGETVERSIONPROC) GetProcAddress(hDllInst,
                              TEXT("DllGetVersion"));
    Da bekomme ich einen NULL Zeiger zurück was bedeutet dass die dll das hier nicht unterstützt:
    DLL supports version retrieval function
    Es handelt sich bei mir nicht um eine gewöhnliche dll sondern um einen COM InProc Server,
    "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
     

  12. #12
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    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

  13. #13
    RuFFnEcK RuFFnEcK ist offline Mitglied Gold
    Registriert seit
    Jan 2004
    Beiträge
    203
    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
     

  14. #14
    RuFFnEcK RuFFnEcK ist offline Mitglied Gold
    Registriert seit
    Jan 2004
    Beiträge
    203
    Hiilfe

    Habs eingebaut und würde denk ich , nur brauch ich folgendes:

    - Definition von:
    Code :
    1
    
    LANGANDCP

    - Verwendung des Übergabeparameters pProperty in der Funktion:
    Code :
    1
    
    BOOL GetVersionProperty(LPCTSTR pszPath, CString& sRet, LPCTSTR pProperty)
    Ich versteh hierbei nicht warum Übergabeparameter und nicht Rückgabeparameter...

    Danke im Vorraus

    Grüße
    RuFF
     

  15. #15
    MCoder MCoder ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jul 2005
    Ort
    München
    Beiträge
    2.448
    Zitat Zitat von RuFFnEcK
    Zum einen wer oder was ist "LANGANDCP FAR" in der Funktion "GetLanguage()" ?
    Sorry, hab leider das zugehörige typedef vergessen:
    Code :
    1
    2
    3
    4
    5
    
    typedef struct tagLANGANDCP
    {
        WORD wLanguage;
        WORD wCodePage;
    } LANGANDCP;
    Zitat Zitat von RuFFnEcK
    Scheinbar erwartet die Funktion diesen Parameter "LPCTSTR pProperty" von mir aber ich weiß net was da rein soll...
    Einfach als String übergeben, z.B.: GetVersionProperty("CompanyName", ...
    Zitat Zitat von RuFFnEcK
    Ich versteh hierbei nicht warum Übergabeparameter und nicht Rückgabeparameter...
    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.

    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

  1. DLL mitgeben aber nicht registrieren?
    Von DrMueller im Forum .NET Application und Service Design
    Antworten: 0
    Letzter Beitrag: 18.12.09, 11:46
  2. Antworten: 5
    Letzter Beitrag: 26.06.06, 19:10
  3. FTP-Server! aber welcher?
    Von FingerSkill im Forum Linux & Unix
    Antworten: 3
    Letzter Beitrag: 14.03.06, 01:23
  4. Email server Aber Wie ?!
    Von Florianrau im Forum Hosting & Webserver
    Antworten: 3
    Letzter Beitrag: 31.03.05, 18:06
  5. Server installieren, aber wie?
    Von ea- im Forum Linux & Unix
    Antworten: 1
    Letzter Beitrag: 26.12.01, 11:08