[fpc-devel] VMT compatibility
Alexey Barkovoy
clootie at ixbt.com
Sun Jan 30 11:35:53 CET 2005
----- Original Message -----
From: "Florian Klaempfl" <F.Klaempfl at gmx.de>
>> For example "DECLARE_INTERFACE_(IClassFactory, IUnknown)" in C++ is expanded
>> to "struct FAR IClassFactory : public IUnknown", so really public parts of
>> VMT (with positive offset) are always [should be] compatible. Surely we can't
>> talk about FULL compatibility of classes, but exposing "interfaces" to other
>> languages should be possible.
>
> Use raw interfaces for such a purpose.
Problem is here:
>> Problem here is what I'm forced to use some these COM incompatibe
>> "interfaces" exposed by MS programmers in DirectX API. These interfaces look
>> like real COM interfaces but without IUnknown embedded. In Delphi I can use
>> them just by creating abstract class just like in C++, but in FPC it's
>> impossible to do so. And I've seen other reports when people were forced to
>> use similiar cripped interfaces exposed by C++ programmers. So it's the real
>> problem not just artificial one.
Delphi and FreePascal simplest interfaces already includes IUnknown. So using
raw interfaces is incompatible here too.
Actually I have working solution and it's based as you hinted on interface
feature of object pascal, but after quering interface a have to patch object
instance so pointer to VMT start pointing above IUnknown part of it. Something
like this:
var
AllocI: ID3DXAllocateHierarchy_Interface;
begin
AllocI:= pAlloc;
// Now patch interface VMT - so it will point to truncated interface (without
IUnknown)
Inc(PInteger(AllocI)^, $C);
// Call C++ function and pass to it our "special" interface
Result := D3DXLoadMeshHierarchyFromX_FPC_{$}(Filename, MeshOptions,
pD3DDevice, AllocI, pUserDataLoader, ppFrameHierarchy, ppAnimController);
Dec(PInteger(AllocI)^, $C); // Patch interface VMT - BACK
end;
But I really want FPC be compatible with Delphi in this situation.
More information about the fpc-devel
mailing list