Just getting started with Nim and experimenting with Delphi interop. I can pass 
a Delphi interface reference (which is basically a pointer) into a Nim DLL and 
call methods on the interface using code like this for the definition:
    
    
    type
      GUID* {.pure.} = object
        Data1*: int32
        Data2*: uint16
        Data3*: uint16
        Data4*: array[8, uint8]
      
      LONG* = int32
      ULONG* = int32
      IID* = GUID
      REFIID* = ptr IID
      HRESULT* = LONG
    
    type
      ITestIntfVtbl* {.pure, inheritable.} = ptr object   # We don't want it 
managed by the GC so use ptr rather than ref.
        QueryInterface*: proc (This: ptr ITestIntf; riid: REFIID; ppvObject: 
ptr pointer): HRESULT {.stdcall.}
        AddRef*: proc (This: ptr ITestIntf): ULONG {.stdcall.}
        Release*: proc (This: ptr ITestIntf): ULONG {.stdcall.}
        TestProc1*: proc(This: ptr ITestIntf) {.stdcall.}
        TestProc2*: proc(This: ptr ITestIntf) {.stdcall.}
      
      ITestIntf* = object
        lpVtbl*: ptr ITestIntfVtbl
      ITestIntfRef* = ptr object
    
    
    Run

And this to use it:
    
    
    import iunknown2
    
    proc getRefCount*(intf: ITestIntf): int {.cdecl, exportc, dynlib.} =
      intf.lpVtbl.TestProc1(cast[ptr ITestIntf](intf))   # Call the Delphi proc
      var rtn: ULONG
      rtn = 999          # Just return an int for testing
      result = rtn
    
    
    Run

However, when I try the following to get an interface reference from a DLL 
function I get a nil pointer on the Delphi side:
    
    
    import iunknown2
    
    proc GetTestIntf*(): ITestIntfRef {.cdecl, exportc, dynlib.} =
      var intf: ITestIntf
      intf = ITestIntf()
      result = cast[ptr ITestIntf](intf)
    
    
    Run

I'm obviously missing something here - can anyone see what I'm doing wrong?

Thanks, Bob

Reply via email to