Frage

Mein Chef möchte, dass ich eine DLL in C ++ (MSVC ++ 2010) schreibe, die eine Lautstärkerei -Schattenkopie ausführen kann, die er von VB6 (oder zu einem späteren Punkt andere Sprachen) aufrufen kann und die Statusaktualisierungen zurückgeben können, während er nicht fertig ist . Er nennt es "Ereignisse".

Ich habe das Gefühl, dass ich endlich Com lernen muss (ich würde lieber nicht ...) ... Außerdem kommt mir eine Rückruffunktion in den Sinn, aber es ist sicherlich unmöglich, Funktionszeiger von VB6 bis C ++ zu übergeben.

Kann jemand skizzieren, was ich lernen muss und wie dies erreicht werden kann, mit oder ohne COM?

Bearbeiten: Um eine Frage zu beantworten, soll der Arbeitsfluss sein:

  1. Die VB6 -App bestimmt, welche Dateien sie sichern sollen

  2. Ich habe einen Pfad und erstelle eine temporäre Lautstärkeschattenkopie, die diesen Pfad enthält und einen Mountspunkt zurückgibt (oder ähnliches).

    • Während dieses Schritts sage ich regelmäßig der VB6 -App, wie weit ich bin

  3. Die VB6 -App unterstützt die Schattenkopie und löscht dann die Schattenkopie.

War es hilfreich?

Lösung

Sie können einen Zeiger an Ihre Funktion "Fortschritt anzeigen" von der VB -App über die C ++ - DLL -App übergeben, indem Sie die AddressOf Operator:

Declare Function CallMyDll ...

Sub DisplayStatus(ByVal SomeParameter As Long)
    ' ...
End SUb

Sub DoSomething()
    Call CallMyDll(AddressOf DisplayStatus)
End Sub

Einige sind nicht so offensichtlich gotchas:

  1. Sie müssen Ihren C ++ - Funktionszeiger mit dem deklarieren __stdcall Konvention anrufen. (Danke, Alexandre C!)

  2. In Ihrer VB -Rückruffunktion, Markieren Sie Ihre Parameter explizit als nach einem Wert Verwenden des Schlüsselworts ByVal. In ähnlicher Weise markieren Sie in Ihrem C ++-Funktionszeiger Ihre Parameter nicht als Nachweis.

  3. Wenn Sie eine Zeichenfolge an den Rückruf übergeben oder eine Zeichenfolge daraus abrufen möchten, müssen Sie diese VB berücksichtigen Strings sind nicht gleich c char*S, C ++ std::stringS oder Microsoft's CStrings. VB StringS muss Microsofts ziemlich dunkel abgebildet werden BSTR Datentyp.

  4. Ich habe eine sehr wichtige Sache vergessen: Ihr Rückruf muss sich in einem VB -Modul befinden (dh es muss eine "bloße Funktion" sein, keine Klasse "oder eine Form eines Formulars).

Andere Tipps

Ihr Chef kann Funktionen anrufen, die von einer DLL mit dem exportiert werden Erklären Aussage. Das skaliert sich nicht gut, ist aber in Ordnung für eine einfache API. Ihre Funktion sollte mit den Deklaratoren "C" und __declspec (DLEXPORT) exportiert werden, verwenden Sie die __stdcall -Aufrufkonvention und verwenden Sie nur einfache Argumententypen.

Wann muss diese Statusaktualisierungen bereitgestellt werden?
Beim Einrichten von VSS? Oder während Sie die Daten und dergleichen unterstützen? Im letzteren Fall gibt VSS nur einen Pfad zurück, der direkt von VB verwendet werden kann.
Aber für das Setup ... könnte es auch sinnvoll sein, weil es ziemlich langsam sein kann, aber ich denke, Sie können es in eine Zustandsmaschine verwandeln - geben Sie alle VSS -API -Anrufe in einen großen Schalter () und machen Sie eine Funktion, die aufrufen würde sie nacheinander und aktualisieren den Status var.

Update: Ich meine so etwas. Init () und Step () sind Ihre Funktionen, die von Ihrer DLL exportiert und von VB aufgerufen werden.
Alternativ können Sie einen Thread erzeugen, um all das (noch in der DLL) und Status -Updates nach dem Schlaf (100) in Schritt () zu erledigen.

int s; // state

int Init( void ) { s=0; }

int Step( void ) {

  switch( s ) {

    default: break;

    case 0: 
    CoInitialize(0); break;

    case 1: 
    r = CreateVssBackupComponents(&vssc); 
    if( FAILED(r) ) s=-1;
    if( vssc==0 ) s=-2;
    break;

    case 2: 
    r = vssc->InitializeForBackup();
    if( FAILED(r) ) s=-3; 
    break;

    case 3: 
    r = vssc->SetBackupState( FALSE, FALSE, VSS_BT_COPY, FALSE );
    if( FAILED(r) ) s=-4;
    break;

    [...]

  }

  s += (s>=0);
}

Ich würde den Job ohne Com machen. Stattdessen würde der VB -Teil einen Fensterhandle an die DLL senden lassen, und die DLL wird eine Nachricht an das Fenster veröffentlichen, das seinen Fortschritt mitteilt.

Sie könnten COM verwenden, aber das ist eine Art im Bereich des Swating einer Fliege mit einem Vorschlaghammer.

Nehmen Sie die Unix-y-Route. Erstellen Sie ein Programm, das die Kopie ausführt und einen Fortschrittsindikator für STD ausgibt. Lassen Sie die VB -App diese Ausgabe analysieren, um den Abschlussprozentsatz zu erzielen.

Ich würde das tun:

  • Die VB -App ruft die Funktion in Ihrer DLL auf und bittet darum, die Schattenkopie zu starten. Ihre DLL startet einen Thread, der die Schattenkopie ausführt und eine ID (eine Thread -ID?) Zurück zur VB -App zurückgibt

  • Die VB-App fordert regelmäßig eine Funktion "Fortschritt" in Ihrer DLL auf, die die zuvor empfangene Operations-ID übergibt: Die Fortschrittsfunktion gibt eine Ganzzahl 0-100 zurück, um den Fortschritt anzuzeigen

  • Auf diese Weise kann die VB -App mehrere Vorgänge parallel starten.

Der Thread, der die Kopie ausführt, sollte ab und zu eine "Fortschrittsvariable" aktualisieren. Eine weitere Funktion in der DLL, die die Kopie stoppt, wäre ebenfalls nützlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top