Hallo,
Interfaces &
Guid etc. sind nicht so mein Ding. Daher hier die nächste Frage
Ich habe eine C++ Vorgabe
Code:
interface IA4APRIVATE : public IUnknown
{
virtual DWORD iA4APrivateGetVersion() = 0;
virtual void iA4APrivateEnumerate() = 0;
virtual void iA4APrivateEnumSetCallback(BOOL(void*), void* pCbData) = 0;
....
}
Das Ganze habe ich wie folgt 'verdelphiet'
Code:
IA4APRIVATE = interface(IUnknown)
['{A26078C5-2840-4726-B427-E60FC8FEE403}']
function iA4APrivateGetVersion(): dWord; stdCall;
procedure iA4APrivateEnumerate(); stdCall;
procedure iA4APrivateEnumSetCallback(handled: boolean; pCbData: pByte); stdCall;
....
end;
Soweit, so gut.
Nun rufe ich das ganze wie folgt auf:
Code:
uses A4APrivateDeclaration, Asio, windows;
type TA4APrivate = Class (TObject)
Private
IA4APrivate: A4APrivateDeclaration.IA4APRIVATE;
versionString: String;
function InterfaceOk: boolean;
function IsResultOk(const lastResult: dWord): boolean;
Public
constructor Create;
Destructor Destroy; override;
Function InitInterface(const asioInterface: Asio.IAsio): boolean;
Function GetVersionString: String;
end;
Function TA4APrivate.InterfaceOk: boolean;
begin
result:= ( Assigned(iA4APrivate) );
end;
Function TA4APrivate.InitInterface(const asioInterface: IASIO): boolean;
var
dl: dWord;
begin
IA4APrivate:= nil; //Just for safety
result:= Assigned(asioInterface);
if result then begin
result:=
ActiveX.Succeeded(asioInterface.QueryInterface(
A4APrivateDeclaration.IID_IA4APRIVATE, IA4APrivate));
result:= result And InterfaceOk;
if result then begin
dl:= IA4APrivate.iA4APrivateGetVersion;
versionString:= IntToHex(hiWord(
dl),4) + '.' +
IntToHex(loWord(
dl), 4);
end else begin
versionString:= 'Error';
end;
end; //Breakpoint for check
end;
Und jetzt passiert folgendes (wenn man mit dem entsprechenden AsioInterface aufruf).
- Queryinterface findet das Interface
- Für windows 64 compiliert alles okay
- Für windows 32 compiliert läuft es bis zum Ende durch (Breakpoint), versionString enthält den korrekten Wert, aber dann bekomme ich einen
Access-Violation error.
Wenn im zweiten Fall nichst oder eine Schmarn zurückkäme, dann würde ich sagen, okay, funktioniert halt mit 32Bit nicht. Aber so bin ich völlig verwirrt..
Hier noch der Aufruf der Funktion
Code:
procedure TASIOIO.InitA4APrivate;
var
bl: Boolean;
hs: String;
begin
if (Assigned(iA4AP)) then begin
//Just check for the A4A Private Interface
bl := iA4AP.InitInterface(treiber.Driver);
if bl then begin
hs:= iA4AP.GetVersionString;
Messagebox(0, pChar(hs), 'Juhu', mb_Ok);
end;
end;
end;
Ich hab schon versucht im Netz einen Hinweis zu finden, aber anscheinend habe ich die falschen Suchworte....
Tomy