Results 1 to 2 of 2

Thread: Delphi7 callback voor VB.NET Type Library opgeven

  1. #1

    Question Delphi7 callback voor VB.NET Type Library opgeven

    Hoi,

    Probleempje. Hoe maak je in Delphi 7 (niet .NET) een callback die door een VB.NET DLL (Type Library) gebruikt kan worden? De VB DLL heeft bijvoorbeeld een stukje code als dit:
    Code:
    Public Delegate Sub DeviceCallBack(ByVal data as integer)
    ...
    public class DeviceDLL  ' COM class
        Public Sub initialize(ByVal callBack As DeviceCallBack)
    Wel, ik laat Delphi de DLL importeren (project > Import Type Library) zodat er een _TLB.pas bestand gemaakt wordt. Hier komt ook CallBack in terug, maar in de vorm van...
    Code:
      _DeviceCallBack = interface(IDispatch)
    Ik kan de DLL gewoon gebruiken, maar mijn CallBack opgeven lukt uiteraard niet op de traditionele manier:
    Code:
    	procedure callBack( data : integer );
    	begin		
    	end;
     ...
    	var dev : TDeviceDLL;  // Uit de _TLB.pas unit
    	dev.initialize( @callBack ); // Mag niet he
    Groetjes,
    Rick
    Tower22 game --> www.tower22.blogspot.com

  2. #2
    hmmm, heb het min of meer zelf al opgelost. Alhoewel ik niet zeker weet of dit doorgaans de "beste" methode is. Maar welicht heeft iemand er iets aan, of kunt u mij op betere ideëen brengen.

    Ipv een functie-pointer naar de .NET DLL te sturen, heb ik een interface object gemaakt:
    Code:
    VB.NET
    Public Interface DEV_CallBackObject
        Sub test(byval data as integer)
    End Interface
    ...
    ' Delphi programma roept onderstaande functie aan om een callback object toe te wijzen
    sub setCallBacks( byval cbo as DEV_CallBackObject )
    De "cbo" variabele uit bovenstaande code is een object uit het Delphi programma. Deze class heeft dan de specifieke afhandeling voor de functie "test":
    Code:
    // interface "dev_callBackObject" staat in de automatisch gegenereerde _TLB.pas unit die je krijgt bij "project > import type library"
          TDEV_CallBacks  = class(TInterfacedObject, DEV_CallBackObject)  
        // Specifieke uitvoering van functie "test", binnen het Delphi programma
        // dus. VB DLL kan via de gegeven "cbo" deze functie aanroepen.
              procedure test( data : Integer );
    
    // Deze rommel moest ik ook perse implementeren. Weet niet of het erg is,
    // maar de functies heb ik leeg gelaten...
              function GetTypeInfoCount(out Count: Integer): HResult; stdcall;
              function GetTypeInfo(Index, LocaleID: Integer; out TypeInfo): HResult; stdcall;
              function GetIDsOfNames(const IID: TGUID; Names: Pointer;
                    NameCount, LocaleID: Integer; DispIDs: Pointer): HResult; stdcall;
              function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
                    Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult; stdcall;
          end;
    ...
    cbo := TDEV_CallBacks.Create;
    DLL.setCallBacks( cbo );
    Het lijkt tot dusver te werken (ook met die @#$@# strings )
    Tower22 game --> www.tower22.blogspot.com

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •