Wie wird ein ADO-Recordset in XE6 getrennt?

8

Ich versuche, ein getrenntes ADO Recordset in XE6 zu verwenden. Die Idee ist, dass Sie das Recordset normal öffnen und dann die ActiveConnection des Recordsets auf das Äquivalent Ihrer Sprache für null / Nothing / nil :

setzen
  

rs.Set_ActiveConnection( null );

Das folgende Beispiel aus Delphi 5 funktioniert gut:

%Vor%

Es funktioniert in Delphi 5

Das Problem ist, dass ich es in Delphi XE6 nicht funktionieren lassen kann. In Delphi 5 würde ich erfolgreich aufrufen:

%Vor%

und alles hat prächtig funktioniert. Es funktionierte, weil _Recordset interface wie folgt deklariert wurde:

%Vor%

Es war also möglich, nil zu übergeben; und es hat funktioniert.

In XE6 änderte sich die Delkaration zu:

%Vor%

An die Sie nil nicht übergeben können. Die Frage wird dann, was ist das OleVariant Äquivalent von nil ?

Probieren Sie # 1

aus %Vor%

Versuchen Sie # 2

%Vor%

verursacht eine Ausnahme:

  

Argumente sind vom falschen Typ, liegen außerhalb des zulässigen Bereichs oder stehen in Konflikt zueinander.

Versuchen Sie # 3

%Vor%

verursacht eine Ausnahme:

  

Argumente sind vom falschen Typ, liegen außerhalb des zulässigen Bereichs oder stehen in Konflikt zueinander.

Versuchen Sie # 4

%Vor%

verursacht eine Ausnahme:

  

Argumente sind vom falschen Typ, liegen außerhalb des zulässigen Bereichs oder stehen in Konflikt zueinander.

Versuchen Sie # 5

%Vor%

Versuchen Sie # 6

%Vor%

verursacht eine Ausnahme:

  

Argumente sind vom falschen Typ, liegen außerhalb des zulässigen Bereichs oder stehen in Konflikt zueinander.

Versuchen Sie # 7

Es ist mir klar, dass Codebarcadero die Erklärung falsch verstanden hat. Es sollte wirklich ein IDispatch sein. Das heißt, ich muss den Compiler dazu bringen, einen OleVariant an der Adresse 0x00000000 (d. H. Nil) zu übergeben. Auf diese Weise sieht ADO den Wert 0x00000000 auf dem Stack und weiß, dass ich meine null :

%Vor%

Ich bin sicher, Bo..Imp ... Co..Emmarcadero hat den beabsichtigten Weg, dies zu nennen; Ich kann es einfach nicht herausfinden.

Delphi 5 Assembly

Delphi 5 macht das Richtige; Es drückt $ 00 (d. h. nil ) auf den Stapel:

rs.Set_ActiveConnection(nil); push rs.Set_ActiveConnection(nil); lea eax,[ebp-%code%0000d8] call Null lea edx,[ebp-%code%0000d8] lea eax,[ebp-%code%0000c8] call @OleVarFromVar push dword ptr [ebp-%code%0000bc] push dword ptr [ebp-%code%0000c0] push dword ptr [ebp-%code%0000c4] push dword ptr [ebp-%code%0000c8] mov eax,[ebp-] push eax mov eax,[eax] call dword ptr [eax+c] ;push nil mov eax,[ebp-] ;get address of rs push eax ;push "this" mov eax,[eax] ;get VMT of IRecordset call dword ptr [eax+] ;call offset of VMT

Während Delphi XE6 heroische Anstrengungen unternimmt, etwas zu tun, weiß ich nicht was:

%code%

Bonuslesen

Ian Boyd 14.08.2015, 19:24
quelle

1 Antwort

4

In D7 (ohne D5 zur Hand) enthält AdoInt.Pas zwei Varianten von Set_ActiveConnection, z. B.

%Vor%

und in Delphi XE6:

%Vor%

Versuchen Sie also die andere Version in XE6. Persönlich hätte ich es versucht

%Vor%

zuerst, aber Sie sagen in Kommentaren, dass _Set_ActiveConnection für Sie funktioniert.

Der Grund, warum ich Set_ActiveConnection (IDispatch (Nil)) zuerst versucht habe, ist für eine Schnittstelle, die ein OleVariant benötigt, folgendes: Seit dem Hinzufügen von Interfaces zu Delphi (in D3?) wurde in der Version Iirc verwendet Nachdem die variantenbasierte OLE-Automatisierung hinzugefügt wurde (D2), konnte der Compiler Code für die Konvertierung in beide Richtungen zwischen einer OleVariant- und einer IDispatch-Schnittstelle generieren. Das "Problem" besteht also darin, eine IDispatch-Schnittstelle als OleVariant-Argument zu übergeben. Dieses bisschen, zu meiner einfältigen Art, es zu betrachten, ist einfach, schreiben Sie einfach IDispatch (), wo das Argument eine OleVariant sein soll, und lassen Sie den Compiler den zu generierenden Code sortieren. Und wenn der Wert übergeben werden soll, weil die IDisaptch-Schnittstelle tatsächlich Nil ist, müssen wir nur

schreiben %Vor%     
MartynA 14.08.2015, 20:17
quelle

Tags und Links