NLDelphi logo

Apada
Start Forum Nieuws Artikelen Links E mail Statistieken
NLDelphi

Ga Terug   NLDelphi > Vraagbaak > .NET

Antwoord
 
Onderwerpopties Zoek in onderwerp Stem op Onderwerp Weergavemodus
Oud 30-Jun-10, 14:27   #1
boekspek
Registered User
 
Geregistreerd op: Apr 2009
Berichten: 12
delphi .NET dll aanroepen vanuit delphi Win32

Hallo,

Ik moet wat functies aanroepen in een vb.net dll.

Hiervoor wil ik een wrapper dll maken in delphi.net en deze dll dan weer aanroepen in delphi Win32.

De vb.net dll functies aanroepen in delphi.net gaat prima.
Als ik echter de functies beschikbaar stel in een delphi.net dll lukt het mij niet om deze dll aan te roepen met delphi win32.

Mijn vraag, hoe roep ik een delphi.net dll aan in delphi win32?

Ik heb een voorbeeld gevonden op https://forums.codegear.com/message....ssageID=138423 maar deze krijg ik ook niet aan de praat.

Ik heb met de sn.exe util een strong name key gemaakt, deze key heb ik in het project bij de dll toegevoegd, daarna heb ik de dll en exe gecompileerd.

De dll heb ik in de global assembly cache toegevoegd.

Als ik de .exe opstart, dan blijft de applicate hangen op het punt dat de .dll wordt aangeroepen.

Ik maak gebruik van RAD Studio 2007.

Kan iemand mij hiermee verder helpen?
boekspek is offline   Met citaat antwoorden
Oud 30-Jun-10, 14:33   #2
boekspek
Registered User
 
Geregistreerd op: Apr 2009
Berichten: 12
Het voorbeeld wat ik gebruik is te downloaden op: http://cc.embarcadero.com/Item/22688
boekspek is offline   Met citaat antwoorden
Oud 30-Jun-10, 21:09   #3
Marcel
Beheerder
 
Marcel's Avatar
 
Geregistreerd op: Mar 2001
Locatie: Earth
Berichten: 17.422
Je kunt om je .NET assembly een COM interop maken. Je assembly is dan voor je Win32 client een standaard COM object en als zodanig aan te roepen. Zie ook het stukje uitleg in de projectfile van je assembly:

Delphi Code:
  1. //
  2. // Use the attributes below to control the COM visibility of your assembly. By
  3. // default the entire assembly is visible to COM. Setting ComVisible to false
  4. // is the recommended default for your assembly. To then expose a class and interface
  5. // to COM set ComVisible to true on each one. It is also recommended to add a
  6. // Guid attribute.
  7. //
  8.  
  9. [assembly: ComVisible(False)]
  10. //[assembly: Guid('')]
  11. //[assembly: TypeLibVersion(1, 0)]
__________________
Marcel
Marcel is offline   Met citaat antwoorden
Oud 01-Jul-10, 16:57   #4
boekspek
Registered User
 
Geregistreerd op: Apr 2009
Berichten: 12
Ik heb gevonden waarom het niet werkt. Het heeft niets met de assembly ComVisible te maken.

Als ik onderstaande delphi.net library complileer en dan aanroep in delpi win32 dan werkt het.

Code:
library connection;

{$UNSAFECODE ON}

uses
   //Borland.Vcl.Classes,
   //Borland.Vcl.SysUtils,
   System.Reflection,
   System.Runtime.InteropServices,
   System.Diagnostics;

function getString(): String;
begin
   Result := 'Hello world!';
end;

exports
   getString;

begin
end.
Echter als de uses die ik in commentaar heb gezet weer aan zet dan werkt het niet meer.

Iemand suggesties waarom dat zo is?

Ik heb de Borland.Vcl.Classes namelijk nodig.
boekspek is offline   Met citaat antwoorden
Oud 01-Jul-10, 21:22   #5
Marcel
Beheerder
 
Marcel's Avatar
 
Geregistreerd op: Mar 2001
Locatie: Earth
Berichten: 17.422
Wat betekent "werkt het niet meer"? Compileert het niet, start het niet op, geeft het een foutmelding?
__________________
Marcel
Marcel is offline   Met citaat antwoorden
Oud 02-Jul-10, 10:12   #6
boekspek
Registered User
 
Geregistreerd op: Apr 2009
Berichten: 12
Als ik onderstaande programma compileer

Code:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function getString(): PChar; stdcall; external 'connection.dll';

var
   str: String;
begin
   try
      str := getString;
      Writeln(str);
   except
      on E:Exception do
         Writeln(E.Classname, ': ', E.Message);
   end;
end.
Als ik bij de delphi.net library de Borland.Vcl.Classes toevoeg aan de uses dan blijft bovenstaande code hangen op de regel str := getString;
Geen foutmelding, het blijft gewoon hangen.
boekspek is offline   Met citaat antwoorden
Oud 02-Jul-10, 11:49   #7
Lord Larry
Aut disce aut discede
 
Lord Larry's Avatar
 
Geregistreerd op: Feb 2003
Berichten: 8.421
In win32 met PChar moet je ook geen functies maken die een string retouneren. Wie geeft de PChar nu vrij? Misschien dat de onderstaande wel werken. Vergeet dan ook de win32 kant niet aan te passen.

procedure GetString(var Result: string);
procedure GetString(SB: StringBuilder);

Een makkelijkere oplossing is de COM suggestie van Marcel. Dan heb je deze problemen niet.
__________________
We adore chaos because we like to restore order - M.C. Escher
Lord Larry is offline   Met citaat antwoorden
Oud 06-Jul-10, 11:03   #8
boekspek
Registered User
 
Geregistreerd op: Apr 2009
Berichten: 12
Als ik in de .NET de GetString verander in: procedure GetString(out Result: String); en in Win32 het aanroep met PChar, dan compileerd het wel, maar dan gaat het nog steeds fout.

Kan iemand misschien een voorbeeld geven (code) van een simplele Delphi.net dll die "Hello World" retouneerd en die ik dan vervolgens weer als COM aanroep in Delphi W32?
boekspek is offline   Met citaat antwoorden
Oud 06-Jul-10, 11:20   #9
Lord Larry
Aut disce aut discede
 
Lord Larry's Avatar
 
Geregistreerd op: Feb 2003
Berichten: 8.421
Via COM? De code die je laat zien doet het namelijk niet via COM. Dus wat wil je? Via COM of via 'normaal' win32?
__________________
We adore chaos because we like to restore order - M.C. Escher
Lord Larry is offline   Met citaat antwoorden
Oud 06-Jul-10, 13:26   #10
boekspek
Registered User
 
Geregistreerd op: Apr 2009
Berichten: 12
Ik wil een delphi.NET dll aanroepen met delphi.W32 via COM.
boekspek is offline   Met citaat antwoorden
Oud 06-Jul-10, 13:59   #11
Lord Larry
Aut disce aut discede
 
Lord Larry's Avatar
 
Geregistreerd op: Feb 2003
Berichten: 8.421
Code:
// Uit het hoofd
[assembly: Guid("Genereer een guid zonder {} met Ctrl-Shift-G")]

type
  [ComVisible(True)]
  TDotNetClass = class
  public
    function GetString: string;
  end;
Dan je Delphi for .Net project builden en regasm gebruiken om de assembly die daar uit komt te registreren.

Dan in Delphi win32 de tlb importeren en dan die assembly kiezen die je gemaakt hebt.

Dan de classe creeeren en de functie aanroepen.

Zie ook:
http://www.blong.com/Conferences/Bor...nterop.htm#CCW
http://forums.devshed.com/delphi-pro...hi-231122.html
__________________
We adore chaos because we like to restore order - M.C. Escher
Lord Larry is offline   Met citaat antwoorden
Oud 08-Jul-10, 10:43   #12
boekspek
Registered User
 
Geregistreerd op: Apr 2009
Berichten: 12
Ik heb een oplossing gevonden voor het vastlopen als ik de Borland.Vcl.* uses gebruik.

Zie thread 28806

Als ik het volgende uitvoer onder Delphi.W32 loopt het niet meer vast:

Code:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function getString(): PChar; stdcall; external 'connection.dll';

var
   str: String;
   Old8087CW: Word; // fix
begin
   try
      Old8087CW := Default8087CW; // fix
      Set8087CW($133F); // fix
      
      str := getString;
      Writeln(str);
      
      Set8087CW(Old8087CW); // fix
   except
      on E:Exception do
         Writeln(E.Classname, ': ', E.Message);
   end;
end.
boekspek is offline   Met citaat antwoorden
Oud 08-Jul-10, 11:31   #13
Lord Larry
Aut disce aut discede
 
Lord Larry's Avatar
 
Geregistreerd op: Feb 2003
Berichten: 8.421
Dat is heel mooi, maar je code is nog niet goed. Misschien werkt het aanroepen van die functie 9 van de 10 keer, maar er zal een keer komen dat het niet werkt.

PS: Je gebruikt nu geen COM
__________________
We adore chaos because we like to restore order - M.C. Escher
Lord Larry is offline   Met citaat antwoorden
Antwoord

Bookmarks


Momenteel bekijken: 1 (0 leden en 1 gasten en/of zoekmachine bots) actieve gebruikers dit onderwerp
 
Onderwerpopties Zoek in onderwerp
Zoek in onderwerp:

Geavanceerd zoeken
Weergavemodus Stem op dit onderwerp:
Stem op dit onderwerp::

Berichting Regels
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Aan
Smilies zijn Aan
[IMG] code is Aan
HTML code is Uit

Forumnavigatie


Alle tijden zijn GMT +1. De tijd is nu 01:42.


Forum software: vBulletin, versie 3.8.4
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.
Copyright ©2008, NLDelphi.com (Dutch Delphi programming)