Toon posts:

VC++ dll met Delphi

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil dus een dll benaderen vanuit Denlhi dat is geschreven in VC++ wat me ook wel lukt.

De VC++ dll returnt 666 die Delphi keurig in een messagebox laat zien. Maar nu komt het, ik wil een stap verder. Het een class in VC++ en deze class bevat een functie die 666 geeft (alles easy om te testen)

OUDE MANIER
=======================================
int main()
{
return 666;
}
=======================================


Myclass heeft een functie geefWaarde die 666 geeft. Als ik in main()
CString blaat = "meer blaat"; dan krijg ik hetzelfde error


NIEUWE MANIER
=======================================
int maint()
{
Myclass myclass;

return myclass.geefWaarde();
}
=======================================

Doe ik nu iets fout of kan Delphi nu niet met de VC++ op deze manier communiceren.

Edit:
De reden waarom ik Delphi en VC++ met elkaar laat communiceren is om de GUI in Delphi en de functies waarvan ik alleen deze in C++ ken.

  • Relix
  • Registratie: Augustus 2001
  • Laatst online: 19-11-2005

Relix

Aerith Gainsborough - Cetra

zou het iets te maken hebben met die "t" achter int maint()? Typo! :p

Indien niet (wat ik waarschijnlijker vind), welke error krijg je, en wat doet CString blaat = "meer blaat"; ?

ot: (ava)grrrrrrrrrrrrrrrrr

If you come here... you'll find me... I promise


Verwijderd

Topicstarter
Die CString blaat doet verder niks (nog niks want ik wil wel verder) zonder die string werkt het ook niet. De error message is :Application failed to initialize property (0xc0000005)

Ik krijg deze fout zodra ik de programme start de functie in de dll wordt dan nog niet eens aangeroepen.

  • Relix
  • Registratie: Augustus 2001
  • Laatst online: 19-11-2005

Relix

Aerith Gainsborough - Cetra

mmmm...interessant...weet je zeker dat je de functie exporteert? Gebruik je de juiste benaming in Delphi? Ik zou het echt niet meer weten...

If you come here... you'll find me... I promise


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Wat is de declaratie van die dll functie in pascal? Ben je niet stdcall of cdecl vergeten?

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


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
c0000005 is een Access Violation; je loopt buiten je geheugen te kladderen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 15:07

Tomatoman

Fulltime prutser

Voor zover ik weet, zijn Delphi classes en C++ Builder classes niet compatible. Met andere woorden: een C++ Builder dll kan geen class retourneren waar je in Delphi iets mee kunt.

Een alternatief is dat je met interfaces gaat werken. Je bouwt in C++ Builder (1) een object dat de interface implementeert en (2) een functie die een instantie van het object creëert en de interface retourneert. Vervolgens roep je vanuit je Delphi-programma deze functie aan. Je verkrijgt daarmee de interface, die je min of meer kunt gebruiken alsof het een object is.

Dat is niet zo moeilijk. Je definieert eerst de interface, die ziet er in Delphi als volgt uit:
Delphi:
1
2
3
4
IWinkelwagen = interface
  procedure AddBoodschap(BoodschapPrijs: Integer);
  function Totaalprijs: Integer;
end;
Hoe de interface er in C++ Builder uit ziet, weet ik niet precies, maar het zal er zeker op de Delphi-code lijken. Vervolgens bouw je in C++ Builder een DLL die de volgende functies bevat:
C++:
1
2
3
IWinkelwinkelwagen Maakwinkelwagen()

void VernietigWinkelwagen(IWinkelwagen Wagen)
MaakWinkelwagen creëert een object dat de IWinkelwagen interface implementeert, VernietigWinkelwagen, ruimt het object daarna weer op.

Vervolgens maak je een Delphi-programma dat de DLL gebruikt:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
procedure DoeIetsMetBoodschappen;
var
  Karretje: IWinkelwagen;
begin
  Karretje := MaakWinkelwagen;
  Karretje.AddBoodschap(3);
  Karretje.AddBoodschap(5);
  ShowMessage('Boodschappen kosten: ' + 
    IntToStr(Karretje.Totaalprijs));  // "Boodschappen kosten: 8"
  VernietigWinkelwagen(Karretje);
end;

[ Voor 0% gewijzigd door Tomatoman op 03-11-2002 23:22 . Reden: voorbeeld uitgewerkt ]

Een goede grap mag vrienden kosten.


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Tomatoman, aller eerst bedankt voor je uitleg natuurlijk :)

Maar als ik het goed begrijp gebruikt TS wel een klasse in zn DLL, maar die functie in kwestie is een gewone platte DLL functie, dat zal het probeelm dus niet direct zijn.

Overgens zijn Delphi en BCB classes wel compatible mits ze (meestal) van de zelfde versie zijn. Een combinatie van Delphi en BCB werkt over het algemeen perfect samen. Maar de TS geeft aan VC te gebruiken en die zijn zeker niet compatible. Ook een mogelijke oplossing die je brengt zal dan niet werken (mits er gebruik gemaakt wordt van COM) omdat VC en Delphi daar erg in verschillen.

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


  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 19-10-2025
als ik het goed begrijp is dit niet een dll probleem en heeft dit ook niks met delphi te maken.
Volgens mij is er gewoon een foutje in de C code.

wat als je is een paar debug dingetjes bij gaat bouwen?
bijvoorbeeld de dll(!) de return waarde in een bestandje laten schrijven, of in een messagebox laten zien.
Als deze waarde klopt weet je tenminste dat je code goed is.
Zo niet kan je gezellig terug naar de tekentafel ;)

This message was sent on 100% recyclable electrons.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 09:55

Creepy

Tactical Espionage Splatterer

De functies die je alleen in C++ kent hebben zeer waarschijnlijk wel een Delphi variant.

Maar dat lost dit probleem niet op ;)

Bij je oude manier return je een int, bij de nieuwe manier een string. Heb je er rekening mee gehouden dat een een String in Delphi niet gelijk is aan een CString in C++? In Delphi moet je dan het PChar type gebruiken. En zoals LordLarry al aangaf: stdcall gebruikt??

Wij hebben hier net zo'n probleem gehad dat tijdens het initialiseren van de app. de boel flink crashte. Dit kwam in ons geval door overmatig gebruik van globale variabelen in de DLL (dit waren er ERRUG veel, en heb toen de programmeur maar verzocht dit wat netter om te bouwen ;) ). Maar ik kan me niet voorstellen dat het probleem hier dezelfde oorzaak heeft.

"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

Pagina: 1