Toon posts:

[Delphi VB6]Delphi-dll gebruiken in VB6

Pagina: 1
Acties:
  • 239 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een dll die in Delphi is gemaakt. Deze dll rekent een aantal erg ingewikkelde procedures uit. Ik moet een array meegeven aan een functie en ik krijg een array terug.

Nu gaat het eerst om het begin stuk.
Hoe koppel ik de dll aan mijn VB6 project?
Ik heb geprobeerd de dll te registreren met regsvr32 dat gaat goed maar ik krijg een foutmelding.

X.dll was loaded but the DllRegistryServer entry point was not found.
DllRegistryServer may not be exported, or a corrupt version of X.dll may be in memory. Consider using PView to detect and remove it.

Ik heb geen flauw idee wat hier wordt bedoeld.

Ik heb ook geprobeerd om in VB6 via 'References' de dll te koppelen maar dat gaat ook niet.

Wat is de juiste procedure om een niet-VB dll te koppelen aan mijn VB6-project?

Groeten
Paul

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 20:34

Delphi32

Heading for the gates of Eden

Zo te zien is de DLL dus geen ActiveX library, dus heb je niet veel aan RegSvr32 (of References in VB). Dat betekent dat je de functies zal moeten declareren binnen je VB project. En daarvoor heb je de beschrijving van de functies in de DLL nodig; ik hoop dat je die wel hebt anders wordt het een lastig karwei.

Verwijderd

Topicstarter
Ik heb inderdaad de functiebeschrijvingen op papier.
Ik heb net nog ergens een voorbeeldprojectje gevonden die een C-dll gebruikte en de daar gebruikte code heb ik aangepast naar mijn situatie:

code:
1
2
3
4
5
Private Declare Sub GB_initDll Lib "X.dll" (ByVal handle As Long, ByVal sTest As String)

Private Sub Form_Load()
  Call GB_initDll(10, "test")
End Sub


Maar dan krijg ik bij de aanroep
code:
1
Call GB_initDll(10, "test")


de volgende foutmelding:

Can't find dll entry point GB_initDLL in X.dll

Betekent dit dat ik het nog niet op de juiste manier doe of roep ik domweg de functie niet goed aan?
Dat laatste ben ik nu aan het uitzoeken.

[ Voor 4% gewijzigd door Verwijderd op 06-04-2004 09:57 . Reden: typos ]


  • MerijnB
  • Registratie: Oktober 2000
  • Laatst online: 22:58
het lijkt erop dat je de naan van de functie in de dll niet goed hebt overgenomen

A software developer is someone who looks both left and right when crossing a one-way street.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

En heb je ook de juiste calling convention in Delphi gebruikt. En weet je zeker dat je zomaar strings over kan geven? Misschien dat VB de String vertaald naar PChar, maar zeker niet naar het String type van Delphi.

Een ActiveX Object/Library is makkelijker te koppelen met VB.

We adore chaos because we like to restore order - M.C. Escher


  • Domokoen
  • Registratie: Januari 2003
  • Laatst online: 26-05 11:01
LordLarry schreef op 05 april 2004 @ 19:38:
Een ActiveX Object/Library is makkelijker te koppelen met VB.
Vind ik niet.

Mijn voorstel: laat ook even de functiedeclaratie in Delphi zien. Hier moet zeker ;stdcall; op het eind staan, en heb je ook ergens "exports Gb_dinges;" staan?
Want je moet de functies wel uit je DLL exporteren.

Bij Visual Studio zit 'Depends' daarmee kan je zien of een DLL wel functies exporteert.

  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 20-05 00:48

ZaZ

Tweakers abonnee

het is ook case sensitive.
dus GB_initDll is anders dan Gb_initDll
misschien hier een foutje gemaakt?

Lekker op de bank


Verwijderd

Topicstarter
Bedankt allemaal voor de respons.
Ik heb inmiddels zelf ook wat meer informatie.

De Delphi-procedure is als volgt gedefinieerd:
code:
1
Procedure GB_InitDll(ApplicationHandle: LongInt; Const GB_MCFMap: PChar);


Ik heb voorbeeldcode hoe de dll te gebruiken in Delphi:
code:
1
2
3
4
5
6
procedure TM_Configurator.FormCreate(Sender: TObject);
begin
GB_InitDLL(Application.Handle,'');
end;

end.


Ik had inderdaad niet goed gelet op de hoofdletters. Ik heb mijn VB-code aangepast:
code:
1
2
3
4
5
6
Option Explicit
Private Declare Sub GB_InitDLL Lib "X.dll" (ByVal handle As Long, ByVal GB_MCFMAP As String)

Private Sub Form_Load()
  Call GB_InitDLL(Me.hWnd, "")
End Sub


Als de GB_InitDLL wordt aangeroepen krijg ik nog steeds de fatale fout:
code:
1
De instructie op 0x00000000 verwijst naar geheugen op 0x00000000. De read-bewerking op het geheugen is mislukt.


en de melding:
code:
1
Can't find dll entry point GB_initDLL in X.dll


De Delphi-dll is nog niet eerder gebruikt buiten Delphi dus het kan zijn dat de dll niet goed is hiervoor maar daarvoor wil ik eerst zeker weten dat IK niet iets fout doe in VB6 voordat ik de DLL-maker hierop ga aanspreken.

[ Voor 3% gewijzigd door Verwijderd op 06-04-2004 09:49 . Reden: Typos ]


Verwijderd

Je functie wordt niet geexporteerd buiten de DLL, zoals Mr.Chinchilla al eerder aangaf moet er ergens in je code een export statement staan. Nu wordt de functie dus niet gezien door andere programmatuur en werkt als een private functie voor de DLL zelf.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 22:35

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op 06 april 2004 @ 10:07:
Je functie wordt niet geexporteerd buiten de DLL, zoals Mr.Chinchilla al eerder aangaf moet er ergens in je code een export statement staan. Nu wordt de functie dus niet gezien door andere programmatuur en werkt als een private functie voor de DLL zelf.
En zoals ook al gezegd, stdcall niet vergeten, aangezien VB niet op dezelfde manier als Delphi / Pascal parameters doorgeeft aan een functie of procedure.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Ik heb aan de maker van de DLL gevraagd en hij zegt dat hij stdcall wel gebruikt. Ook vertelde hij mij dat hij alle exportfuncties zo heeft gedefinieerd dat ze geen Delphi-zaken gebruiken alleen standaard C.

Ik heb nog even via Depend gekeken zoals Mr.Chinchilla zei en ik weet niet precies wat ik hier mee moet maar ik zie dit:

code:
1
2
3
4
5
6
7
8
9
10
11
Ordinal     Hint               Function            Entry Point
1               9          SetDebug
2               4          GB_showError
3               3          GB_showAbout
4               5          GB_showSettings
5               8          GB_show1
6               7          GB_show2
7               0          GB_show3
8               6          GB_show4
9               2          GB_show5  
10              1          GB_InitDll


Het lijkt me dat de DLL dan toch wel goed is en dat ik toch iets fout doe in VB6 met de aanroep.

Nog iemand advies of zie ik wat over het hoofd?

Verwijderd

Topicstarter
Als ik twee andere fucnties gebruik:
code:
1
2
3
4
5
6
7
8
Option Explicit
Private Declare Sub GB_ShowError Lib "X.dll" (ByVal ErrID As Long)
Private Declare Sub GB_ShowAbout Lib "X.dll" ()

Private Sub Form_Load()
  Call GB_ShowAbout
  Call GB_ShowError(1)
End Sub


dan krijg ik wel de popups die de functies moeten doen. Dus die gaan goed maar als ik dan mijn form sluit en dus de applicatie verlaat komt weer de fatale fout van het geheugen lezen.

Dus is misschien de DLL toch niet helemaal je van het?

Enig idee waar dat aan zou kunnen liggen (binnen Delphi dan)? De eerder genoemde opties (stdcall en export) zitten al in de DLL.

  • Domokoen
  • Registratie: Januari 2003
  • Laatst online: 26-05 11:01
Als je applicatie gaat crashen na het aanroepen van een functie (die het wel doet), dan wijst dat meestal tóch op de calling convention die niet goed staat.
Bij je delphi functie declaratie zag ik geen stdcall staan trouwens...
Trouwens, het is GB_InitDLL die je moet gebruiken en dus niet GB_initDLL zoals je deed.

[ Voor 17% gewijzigd door Domokoen op 06-04-2004 13:48 ]


Verwijderd

Topicstarter
Ik gebruik nu wel GB_InitDLL en ik krijg nog steeds dezelfde foutmelding.
Ik heb net de delphi-code kunnen bekijken en er wordt wel degelijk stdcall gebruikt.
De maker van de DLL stelde voor om in Delphi een klein programmaatje (dll) te maken die ik dan via VB6 aanroep. Ik moet dan kunnen debuggen via Delphi.
Hier kijk ik morgen wel naar want mijn kennis van Delphi is nog minder dan van VB6 ;)

Verwijderd

Topicstarter
We zijn er eindelijk uit. Het heeft nogal wat hoofdbrekers gekost ;)
De fout zat in de Delphi-dll. De dll exporteerde de functie als *_DLL (allemaal hoofdletters) maar de functie zelf was *_Dll (deels kleine letters).
Nu werkt alles weer.
Bedankt voor alle hulp. _/-\o_
Pagina: 1