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
:
rs.Set_ActiveConnection(
null);
Das folgende Beispiel aus Delphi 5 funktioniert gut:
%Vor%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:
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
?
verursacht eine Ausnahme:
Argumente sind vom falschen Typ, liegen außerhalb des zulässigen Bereichs oder stehen in Konflikt zueinander.
verursacht eine Ausnahme:
Argumente sind vom falschen Typ, liegen außerhalb des zulässigen Bereichs oder stehen in Konflikt zueinander.
verursacht eine Ausnahme:
Argumente sind vom falschen Typ, liegen außerhalb des zulässigen Bereichs oder stehen in Konflikt zueinander.
verursacht eine Ausnahme:
Argumente sind vom falschen Typ, liegen außerhalb des zulässigen Bereichs oder stehen in Konflikt zueinander.
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
:
Ich bin sicher, Bo..Imp ... Co..Emmarcadero hat den beabsichtigten Weg, dies zu nennen; Ich kann es einfach nicht herausfinden.
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
%code%
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%Tags und Links delphi delphi-xe6 ado