Announcement

Collapse
No announcement yet.

ADO Componenten und DLL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ADO Componenten und DLL

    Kann mir jemand zeigen, wie ich ADO-Komponenten (z.B. TADOC Connection,
    oder TADOCommand) in einer DLL benutze. Sobald ich versuche in der DLL eine TADOConnection zu erzeugen erhalte ich diverse Fehlermeldungen.

    Vielen Dank im Voraus

    Knut Lambert
    ([email protected])

  • #2
    Hallo,

    die folgenden Auszüge stammen aus einer DLL, die über ADO + ADOX eine neue ACCESS2000-Datenbank anlegt, um dort Daten in einer Tabelle ablegen zu können. Der Aufrufer muss dazu das von Windows her gewohnte "Sandwich-Verfahren" (Resource anfordern, Resource nutzen, Resource freigeben) einhalten: <br>
    1. DLL-Schnittstellenprozedur E_DBInit initialisiert die DLL <br>
    2. .....(andere Nutzfunktionen aufrufen) <br>
    3. DLL-Schnittstellenprozedur E_DBDone gibt alle Resourcen wieder frei<br>
    Da sich hinter ADO nur COM-Objekte verbergen, müssen die Apartment-Regeln eingehalten werden (siehe Aufruf von CoInitialize etc.). Hinter <i>TDM_ADO</i> verbirgt sich ein <b>Datenmodul</b>, so dass die ADO Express-Komponenten dort ganz normal über den Objektinspektor konfiguriert werden können.
    <pre>
    resourcestring
    cCONNECTSTRING = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=';

    function E_DBInit(const pNewMDBPath: PChar): Integer;
    var
    aCatalog : _Catalog;
    sDS : String;
    sMsg : String;
    begin
    Result := 1;
    bDoCoUninitialize := False;
    bDoDestroyDM_ADO := False;
    try
    //
    sMsg := 'CoInitialize-Fehler';
    CoInitialize(nil);
    bDoCoUninitialize := True;
    //
    sMsg := 'ACCESS-Datenbankdatei konnte nicht gelöscht werden.';
    sMDBPath := pNewMDBPath;
    if FileExists(sMDBPath) then
    DeleteFile(sMDBPath);
    //
    sMsg := 'Fehler beim Zugriff auf die ADOX-Objekte.';
    aCatalog := CoCatalog.Create;
    sConnectionStr := Format('%s%s',[cCONNECTSTRING, sMDBPath]);
    sDS := aCatalog.Create(sConnectionStr);
    aCatalog := nil;
    //
    sMsg := 'Fehler beim Erzeugen des Datenmoduls';
    DM_ADO := TDM_ADO.Create(nil);
    bDoDestroyDM_ADO := True;
    sMsg := 'Fehler beim Erzeugen der Tabelle »Adressen«';
    DM_ADO.DoCreateTable;
    except
    ShowExceptionMsg(sMsg);
    Result := 0;
    end;
    end;

    function E_DBDone: Integer;
    begin
    Result := 1;
    try
    if bDoDestroyDM_ADO then
    DM_ADO.Free;
    if bDoCoUninitialize then
    CoUninitialize;
    except
    ShowExceptionMsg('E_DBDone-Fehler');
    Result := 0;
    end;
    end;
    </pre&gt

    Comment

    Working...
    X