Avatar billede flycht Nybegynder
03. maj 2006 - 11:43 Der er 20 kommentarer

benytte dll skrevet i .NET fra Delphi

Jeg har en dll med en klasse, som jeg gerne vil have adgang til fra Delphi. Jeg har registreret dll'en fra DOS-prompten og har fået kontakt fra VBA ved at referere til tlb-filen. Har fået lavet et objekt af testklassen med følgende syntax:

Dim a_Class As New TestClass

Kan jeg gøre det samme i Delphi?

Venlig hilsen

Michael
Avatar billede tolderlund Nybegynder
03. maj 2006 - 12:40 #1
Du skal vælge Project, Import type library
Så kan den bruges i Delphi
Avatar billede flycht Nybegynder
03. maj 2006 - 12:58 #2
Men så sker følgende når jeg kompilerer:

I mscorlib_TLB linje 4515 siger den: Type 'Byte' is not yet completely defined

4514  Byte = packed record
4515    m_value: Byte;
4516  end;

Og der er en masse andre compilefejl med samme besked på typerne: double, single, int64 foruden fejl der siger illegal type in OLE automation section

Kan jeg undgå dem?
Jeg har delphi 5.0.

Venlig hilsen

Michael
Avatar billede gusse Nybegynder
03. maj 2006 - 14:03 #3
tror ikke du kan kører .net i delphi 5 !!! faktisk ret sikker
Avatar billede arne_v Ekspert
04. maj 2006 - 02:52 #4
man kan ikke lave et .NET program i Delphi 5

man kan ikke bruge en vilkårlig .NET assembly i Delphi 5

men man bør kunne bruge et COM objekt også selvom det er skrevet i .NET
Avatar billede tolderlund Nybegynder
04. maj 2006 - 08:37 #5
Arne kom mig i forkøbet.
Hvis det er et com objekt, og det antager jeg udfra spørgsmålet, så er det ligemeget hvad det er skrevet i.
Det burde være nok at importere type library.
Avatar billede flycht Nybegynder
04. maj 2006 - 09:56 #6
Tak for Jeres svar. Det er et COM-objekt, men som bekendt får jeg den der compile-fejl i mscorlib_TLB når jeg prøver at importere type library.

DLL og COM er relativt nye begreber for mig, så jeg må indrømme at jeg ikke helt forstår hvad en tlb-fil er og hvorfra msccorlib_TLB kommer. Men det kan jeg nok også leve uden helt at forstå. Problemet er vel i virkeligheden om jeg kan komme uden om den der compile-fejl på mscorlib_TLB?

Venlig hilsen

Michael
Avatar billede tolderlund Nybegynder
04. maj 2006 - 12:41 #7
Jeg synes navnet mscorlib lyder mærkeligt.
Det er et standard windows library.
Er du sikker på at du har importeret det rigtige type library?
Avatar billede arne_v Ekspert
04. maj 2006 - 13:07 #8
mscorlib er .NET kerne
Avatar billede flycht Nybegynder
04. maj 2006 - 14:23 #9
Jeg har gemt dll-filen på mit c-drev og skrevet følgende kommandoer fra CMD:

linje 1:
“C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\regasm.exe” TestModel.dll /tlb:TestModel.tlb

linje 2:
“C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\gacutil.exe” /if TestModel.dll 

linje 1 skulle vist generere min TestModel.tlb, som jeg efterfølgende prøver at importere fra delphi(import type library) og i linje 2 registrerer dll'en på maskinen.

Er det mon her problemet er?
Avatar billede tolderlund Nybegynder
04. maj 2006 - 16:06 #10
Når du har registreret dit dll så importerer du type library som jeg skrev fra starten.
Avatar billede flycht Nybegynder
04. maj 2006 - 16:11 #11
Det har jeg gjort, men så får jeg fejlen, som beskrevet 03/05-2006 12:58:58.
___________
I mscorlib_TLB linje 4515 siger den: Type 'Byte' is not yet completely defined

4514  Byte = packed record
4515    m_value: Byte;
4516  end;

Og der er en masse andre compilefejl med samme besked på typerne: double, single, int64. Foruden fejl, der siger illegal type in OLE automation section
____________
Og så er det, at jeg ikke kan komme videre og tænker, om jeg har gjort noget forkert eller om min Delphi 5 ikke kan bruge et COM-objekt. Men det har arne_v bekræftet skulle kunne lade sig gøre. Nogen idéer?

Venlig hilsen

Michael
Avatar billede tolderlund Nybegynder
04. maj 2006 - 21:14 #12
Jeg tror stadig på at det er det forkerte type library du importerer.
Avatar billede flycht Nybegynder
05. maj 2006 - 09:39 #13
OK.

Kan du give mig en forklaring på hvilket type-library, som jeg istedet skal importere?

Alt hvad jeg havde da jeg startede var en dll-fil og fra kommando-prompten skrev jeg følgende og fik skabt min testmodel.tlb fil, som jeg efterfølgende har prøvet at importere.

“C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\regasm.exe” TestModel.dll /tlb:TestModel.tlb

Jeg har søgt lidt på nettet og fundet ud af, at flere har haft det samme problem som mig med de der compile-fejl, men der er ikke umiddelbart nogen nemme løsninger.

Jeg vil forsøge mig med en ny Delphi version i weekenden og se om det løser problemet.

Venlig hilsen

Michael
Avatar billede tolderlund Nybegynder
05. maj 2006 - 13:20 #14
Har du prøvet at importere det sådan som jeg flere gang har foreslået?
Avatar billede flycht Nybegynder
05. maj 2006 - 13:27 #15
Hej Tolderlund

I Delphi vælger jeg: New... -> Application
Så klikker jeg på: Project -> Import type library...
Så markerer jeg min tlb-fil
Så klikker jeg Create Unit
Så prøver jeg at kompilere og får følgende fejl:

[Error] mscorlib_TLB.pas(4505): Type 'Byte' is not yet completely defined
[Error] mscorlib_TLB.pas(4520): Type 'Double' is not yet completely defined
[Error] mscorlib_TLB.pas(4546): Type 'Int64' is not yet completely defined
[Error] mscorlib_TLB.pas(4574): Type 'Single' is not yet completely defined
[Error] mscorlib_TLB.pas(4989): Illegal type in OLE automation section: 'Byte'
[Error] mscorlib_TLB.pas(4996): Illegal type in OLE automation section: 'Single'
[Error] mscorlib_TLB.pas(4997): Illegal type in OLE automation section: 'Double'
[Error] mscorlib_TLB.pas(10054): Illegal type in OLE automation section: 'Byte'
[Error] mscorlib_TLB.pas(10061): Illegal type in OLE automation section: 'Single'
[Error] mscorlib_TLB.pas(10062): Illegal type in OLE automation section: 'Double'
[Fatal Error] TestModel_TLB.pas(30): Could not compile used unit 'mscorlib_TLB.pas'

Er det ikke det, som du foreslår?

Venlig hilsen

Michael
Avatar billede tolderlund Nybegynder
05. maj 2006 - 17:30 #16
Nej, ikke helt.
Kyl din tlb-fil ad h til.
Delphi 7 (jeg har ikke Delphi 5 installeret mere):
New, Application
Project, Import type library
Vælg korrekt type library i listen.
Du skal så vælge om du vil have dannet og installeret det som en komponent, eller blot have dannet en unit+tlb.
Jeg plejer som regel det sidste: Fjern hak fra Generate Component Wrapper.
Vælg et bibliotek hvor du vil have type library placeret i Unit dir name.
Klik Create Unit.
Nu har du et type library du kan bruge.
Avatar billede flycht Nybegynder
08. maj 2006 - 09:37 #17
Hej Tolderlund

Tak for dit svar. Kan du specificere hvad korrekt type library er? Er det en tlb, olb, ocx, dll eller exe fil. Hvis jeg smider min tlb-fil ad H til, så har jeg kun dll'en tilbage. Hvis jeg prøver at importere den, så siger programmet:

Could not load type library. Fejl under indlæsning af type-DLL.

Venlig hilsen

Michael
Avatar billede flycht Nybegynder
08. maj 2006 - 09:56 #18
Jeg har lige forsøgt at importere type library på den nye Delphi 2006 og der fungerer det perfekt :-). Det var nok Delphi 5, der var problemet.
Avatar billede flycht Nybegynder
15. maj 2006 - 13:14 #19
Så er jeg kommet ud over mine kompileringsfejl ved at benytte Delphi 2006. Men så opstår mit næste problem - en run-time error:
Exception class EAccessViolation with message 'Access violation at address 00458181 in module 'Project1.exe'.

Jeg har følgende i mit program

Uses TestModel_TLB
...
var
  MyObject:TestClass;
  test:double;
begin
  MyObject.TestDouble:=2;  //disse tre linjer kaster ovennævnte exception
  MyObject.CalcTestdouble;  //
  test:=MyObject.TestDouble;//

Nogen idéer til at løse det? Jeg kan lige tilføje, at de samme tre linjer virker fra VBA.

Venlig hilsen

Michael
Avatar billede flycht Nybegynder
15. maj 2006 - 13:49 #20
En lille tilføjelse. I VBA kalder jeg:

Dim MyObject as New TestClass

I Delphi får jeg vel aldrig kørt constructoren. Det er måske der hvor problemet opstår. Hvordan kalder jeg constructoren? - der er nemlig ikke nogen create-metode.

/Michael
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester