Combineren van C en C++, LoadLibrary troubles

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
Ik loop tegen een probleem aan waarbij ik niet kan verklaren wat er nu misgaat.

We hebben enkele filters geschreven in C, en deze hebben elk een eigen GUI, geschreven in C++/wxWidgets.

Het wxWidgets gedeelte is samengevat in één classe, die vanuit een wxWidgets gebaseerde toepassing aan te roepen is.
Echter, omdat de filters in C geschreven zijn, en deze op een of andere manier de GUI's met zich mee moeten dragen, had ik het volgende bedacht:

applicatie -> laad het filter (C - dll) -> bevat een call die de juiste GUI oproept

Echter, zodra deze laatste call in de C -dll gezet wordt, lijkt er iets mis te gaan met exporteren. Hoewel objdump nog steeds dezelfde functies kent, kan LoadLibrary de functies ineens niet meer laden...

Ik heb geen flauw idee waar ik dit moet zoeken, dus ik hoop dat jullie me opweg kunnen helpen!

alvast bedankt :)

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Hoe roept je C dll de GUI aan? En wat kan LoadLibrary niet meer laden? Ik neem aan dat dat de DLL geschreven in C moet zijn.
Je hebt wel de juiste calling conventions gebruikt en geen last van C++ name mangling?

"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


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
in de (c++/wxWidgets) library is de volgende call geimplementeerd:
C++:
1
extern "C" int openDialog(float* set);
En wat kan LoadLibrary niet meer laden?
C++:
1
dll = LoadLibrary( TEXT("path van de dll") );

dll blijft NULL, terwijl deze wel geladen wordt als ik bovenstaande call uit de C library laat...
Ik neem aan dat dat de DLL geschreven in C moet zijn.
Je hebt wel de juiste calling conventions gebruikt en geen last van C++ name mangling?
Ik heb overal de extern "C" defenities gebruikt, objdump lijkt het met me eens te zijn:
objdump -x de.dll | grep -i openDialog
        6234      185  openDialog
[384](sec  1)(fl 0x00)(ty  20)(scl   2) (nx 0) 0x00000aa0 _openDialog
[476](sec  6)(fl 0x00)(ty   0)(scl   2) (nx 0) 0x00000158 __imp__openDialog

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

  • igmar
  • Registratie: April 2000
  • Laatst online: 03-09 22:58

igmar

ISO20022

En welk OS praten we hier over ? Er zijn een aantal systemen die functiecalls prefixen met een _, en aan het bovenstaande te zien is dit er een van.

Verder : Weet je zeker dat alle dependancies geresolved worden ? Libs die niet willen laden kunnen mogelijk de dependancies niet vinden.

[ Voor 32% gewijzigd door igmar op 27-08-2007 16:36 ]


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
het gaat hier over Windows XP in combi met MinGW.

Maar het bleek inderdaad aan de dependancies te liggen!
Ik wist niet dat dit verder zonder melding zou gaan, ik verwachtte net als bij een programma de melding dat een .dll niet gevonden kon worden :)

thanks!

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

igmar schreef op maandag 27 augustus 2007 @ 16:35:
En welk OS praten we hier over ? Er zijn een aantal systemen die functiecalls prefixen met een _, en aan het bovenstaande te zien is dit er een van.
Waar jij het over hebt is iets anders dan de standaard C mangling om voor alle identifiers een _ te zetten, en dat is wat je hier ziet.

Arjan: Altijd GetLastError() checken als je iets terugkrijgt wat je niet verwacht :)

[ Voor 10% gewijzigd door .oisyn op 27-08-2007 23:09 . Reden: oeps, dank je MSalters :) ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
"mangling" werkt beter in google.

En natuurlijk kan LoadLibrary niet met een window komen, als er iets fout gaat. Dat zou ten eerste een window probleem zijn (wie is de parent, je geeft geen HWND mee) en ten tweede is het soms de verwachting dat iets fout gaat (plugin systemen), dus de caller is evrantwoordelijk voor de error UI.

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


Acties:
  • 0 Henk 'm!

  • igmar
  • Registratie: April 2000
  • Laatst online: 03-09 22:58

igmar

ISO20022

.oisyn schreef op maandag 27 augustus 2007 @ 17:14:
Waar jij het over hebt is iets anders dan de standaard C mangling om voor alle identifiers een _ te zetten, en dat is wat je hier ziet.
Het is alleen relevant voor een dlsym() inderdaad, maar die mangling is niet altijd met een _. Op dit verhaal alleen niet van toepassing.
Arjan: Altijd GetLastError() checken als je iets terugkrijgt wat je niet verwacht :)
Of dlerror() als je een UNIX achtig iets hebt.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Laten we *nix even buiten beschouwing laten in dit Windows topic :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
.oisyn schreef op dinsdag 28 augustus 2007 @ 11:43:
Laten we *nix even buiten beschouwing laten in dit Windows topic :)
De software is cross platform, dus in dit geval kwam het wel goed uit ;)

oprecht vertrouwen wordt nooit geschaad

Pagina: 1