Hallo Forum...
Ich versuche grad einen ca 900 Zeilen langen C++ Code nach Delphi zu übersetzen. Meinem ersten Gefühl nach ist der ganze folgende Code eigentlich nicht zwingend notwendig. Jedoch mag der Code insgesammt nicht funktionieren also versuche ich jetzt ob es damit vielleicht doch eine tiefere Bewandtnis hat. Dort ist Folgendes zu finden:
Code:
class IUnknownImpl: IUnknown {
public:
IUnknownImpl(
GUID guid):_guid(
guid)
{
};
HRESULT __stdcall QueryInterface(REFIID riid , void **ppObj)
{
if (riid == IID_IUnknown||riid == _guid)
{
*ppObj = this;
AddRef() ;
return S_OK;
}
*ppObj = NULL ;
return E_NOINTERFACE ;
}
ULONG __stdcall AddRef () { return InterlockedIncrement(&m_nRefCount) ; }
ULONG __stdcall Release () {
long nRefCount=0;
nRefCount=InterlockedDecrement(&m_nRefCount) ;
if (nRefCount == 0) delete this;
return nRefCount;
}
private:
long m_nRefCount; //for managing the reference count
GUID _guid;
};
Mein Lösungsansatz sieht bisher so aus, jedoch weiß ich beim besten Willen nicht was der Code eigentlich tut...
Delphi-Quellcode:
type
TIAVInterface =
class(TInterfacedObject)
function QueryInterface(
const IID: TGUID;
out Obj): HResult;
stdcall;
function _AddRef: Integer;
stdcall;
function _Release: Integer;
stdcall;
private
FGUID: TGUID;
public
constructor create(
GUID: TGUID);
end;
[..]
constructor TIAVInterface.create(
GUID: TGUID);
begin
inherited create();
FGUID:=
GUID;
end;
function TIAVInterface.QueryInterface(
const IID: TGUID;
out Obj): HResult;
begin
if (IID = FGUID)
then // OR Teil ergänzen
begin
Obj:=Self;
// Operator ist auf diesen Operandentyp nicht anwendbar
_AddRef;
Result:=S_OK;
end
else
begin
Obj:=nil;
Result:= E_NOINTERFACE;
end;
end;
function TIAVInterface._AddRef: Integer;
begin
Result:=InterlockedIncrement(FRefCount);
end;
function TIAVInterface._Release: Integer;
begin
Result:=InterlockedDecrement(FRefCount);
if Result = 0
then
Self.Free;
end;
In
Query Interface läuft er auf einen Fehler. Bin ich mit meinem Ansatz wenigstens dicht dran?
Toni
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?