|
|
||||||||
|
|||||||||
![]() |
|
|||||||
![]() |
|
|
Onderwerpopties | Zoek in onderwerp | Stem op Onderwerp | Weergavemodus |
|
|
#1 |
|
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? |
|
|
|
|
|
#2 |
|
Registered User
Geregistreerd op: Apr 2009
Berichten: 12
|
Het voorbeeld wat ik gebruik is te downloaden op: http://cc.embarcadero.com/Item/22688
|
|
|
|
|
|
#3 |
|
Beheerder
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:
|
|
|
|
|
|
#4 |
|
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.
Iemand suggesties waarom dat zo is? Ik heb de Borland.Vcl.Classes namelijk nodig. |
|
|
|
|
|
#5 |
|
Beheerder
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?
|
|
|
|
|
|
#6 |
|
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.
Geen foutmelding, het blijft gewoon hangen. |
|
|
|
|
|
#7 |
|
Aut disce aut discede
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 |
|
|
|
|
|
#8 |
|
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? |
|
|
|
|
|
#9 |
|
Aut disce aut discede
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 |
|
|
|
|
|
#10 |
|
Registered User
Geregistreerd op: Apr 2009
Berichten: 12
|
Ik wil een delphi.NET dll aanroepen met delphi.W32 via COM.
|
|
|
|
|
|
#11 |
|
Aut disce aut discede
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 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 |
|
|
|
|
|
#12 |
|
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.
|
|
|
|
|
|
#13 |
|
Aut disce aut discede
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 |
|
|
|
![]() |
| Bookmarks |
| Momenteel bekijken: 2 (0 leden en 2 gasten en/of zoekmachine bots) actieve gebruikers dit onderwerp | |
| Onderwerpopties | Zoek in onderwerp |
| Weergavemodus | Stem op dit onderwerp: |
|
|