See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: Exportation des fonctions dans un module DLL  (Read 4793 times)

0 Members and 1 Guest are viewing this topic.

Offline maxoo

  • Jr. Member
  • **
  • Posts: 14
  • Country: France fr
  • Karma: 7
30 January 2018, 21:24:56
Bonjour à tous !
J'en ai un peu parlé dans le topic "Capsule en dur pour NASSP 7.0" mais je remets ça ici pour plus de clarté. La solution -si on la trouve- pourra peut-être aider quelqu'un d'autres...

J'essaie de compiler NASSP 7.0, plus exactement le sous-projet Saturn5NASP (et sa dépendance PanelSDK). APrès paramétrage, ça compile, mais Orbiter freeze à l'ouverture. J'ai pas mal cherché, puis j'ai fini par ouvrir la DLL avec "DLL Export Viewer" pour voir si mes fonctions sont bien là... et elles n'y sont pas. On dirait que la plupart des fonctions OAPIFUNC (alias de DLLIMPORT, alias de __declspec(dllimport), définie dans OrbiterAPI.h) ne sont pas exportées.

Une comparaison de l'exploration de la DLL originelle (d'abord), puis de la mienne...


J'y suis depuis quelques jours et je n'avance plus... Est-ce un mauvais paramétrage de VS2017 ? Ou une lib mal jointe ?

Merci


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #1 - 01 February 2018, 17:46:59
Tous mes encouragements, Maxoo. Malheureusement, je ne connais pas encore
grand chose dans le domaine.


Offline jeanus

  • re-moi !
  • Sr. Member
  • ****
  • Posts: 330
  • Country: France fr
  • Karma: 35
  • Il parait que je suis pénible ... mais heu !
Reply #2 - 02 February 2018, 07:48:57
Bonjour, je galère également avec le C++ mais à tout hasard, "Orbiterapi.h" apparaît-elle dans les "dépendances externes" de ton projet  !?
Si oui ... ???
 :wall:

Tout dépend du point de vue ou l'on se place, par rapport à l'idée qu'on se fait de la chose ...

Offline maxoo

  • Jr. Member
  • **
  • Posts: 14
  • Country: France fr
  • Karma: 7
Reply #3 - 02 February 2018, 22:21:03
Merci à tous les deux pour vos réponses ! :)
OrbiterAPI.h n'est pas dans les dépendances externes, mais dans les Headers. En revanche, on y trouve orbitersdk.h, qui inclut OrbiterAPI.h...

Post Merge: 03 February 2018, 01:17:50
J'ai compris pourquoi les fonctions ne sont pas exportées : elles sont déclarées dans orbiterAPI.h mais jamais définies :wall:. En créant un OrbiterAPI.cpp comportant les définitions (simples fonctions vides) des éléments en question, elles apparaissent dans la DLL comme exportées.

Seulement, j'imagine qu'on n'est pas sensés créer les définitions comme ça... Si c'était le cas elles seraient déjà dans NASSP. Bref, je regarderai plus en détail le SDK demain.

« Last Edit: 03 February 2018, 01:17:50 by maxoo »

Offline jeanus

  • re-moi !
  • Sr. Member
  • ****
  • Posts: 330
  • Country: France fr
  • Karma: 35
  • Il parait que je suis pénible ... mais heu !
Reply #4 - 03 February 2018, 07:21:29
 :wonder: étrange, dans ma DLL OrbiterSDK.h et API.h sont toutes les deux dans les dépendances externes, peut-être faut-il les déplacer manuellement, j'ai déjà fait plusieurs DLL, je n'ai jamais été obligé de créer d'OrbiterAPI.cpp...
Il doit y avoir un "Gag" quelque part !
à suivre ...
 :beer:

Tout dépend du point de vue ou l'on se place, par rapport à l'idée qu'on se fait de la chose ...

Offline Bibi Uncle

  • Legend
  • ******
  • Posts: 2264
  • Country: Canada ca
  • Karma: 17
Reply #5 - 16 February 2018, 20:41:00
Tu ne dois pas définir le fonctions manuellement, ça ne fonctionnera pas au final. Ton problème est que tu n'as pas linké avec orbiter.lib et orbitersdk.lib.

Pour l'explication plus théorique, les __declspec(dllimport) servent à dire au linker que ces déclarations doivent être importées dynamiquement d'un autre module (l'exécutable d'Orbiter dans ce cas). Or, dans les .h, ce ne sont que des déclarations. Quand tu links, tu as besoin des définitions des symboles, sinon le linker va se plaindre. Ces définitions se retrouvent dans les .lib. Dans ces .lib, tu vas retrouver des appels à des fonctions système de Windows pour localiser lesdits symboles dans l'exécutable d'Orbiter.

EDIT:
Je ne crois pas que c'est ça finalement. dllexp ne montre pas les imports normalement. Regarde Deltaglider.dll par exemple, il n'a pas tous ces symboles.

Je ne me souviens plus si InitModule et ExitModule sont nécessaires, mais c'est peut-être le cas. Essaie de les ajouter et de mettre un breakpoint dans ton InitModule, voir si au moins ta DLL est chargée correctement.

« Last Edit: 16 February 2018, 21:04:57 by Bibi Uncle »
Émile

Pluton, Saturne et Jupiter
Entendez-vous monter vers vous le chant de la Terre?

- Luc Plamondon