Créer une dll avec visual C++ 2008 express

Signaler
Messages postés
176
Date d'inscription
mercredi 7 avril 2004
Statut
Membre
Dernière intervention
1 avril 2013
-
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
bonjour à tous
y aurait il quelqu'un qui pourrait m'aider à créer (pas à pas) une dll en c++ avec "visual C++ 2008 express"
Je ne suis pas sur d'abord de quel modèle choisir puis quel fichier créer et enfin comment compiler pour récuperer la dll et enfin comment l'implémenter dans vb.
voici le code que j'aie essayé de rentrer dans main.cpp

//définition du symbole d'export
#define export __declspec (dllexport)

//inclusion des fichiers nécessaires
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

export void __stdcall VariationTableau(unsigned char *PicBits2, unsigned char *PicBits, long nbElem, double coeff);

void __stdcall VariationTableau(unsigned char *PicBits2, unsigned char *PicBits, long nbElem, double coeff)
{
long dec;

    for(dec = 0;dec<nbElem;dec++)
    {
        PicBits[dec] = (unsigned char)(PicBits[dec])+(((unsigned char)(PicBits[dec])-(unsigned char)(PicBits2[dec])) * coeff);
    }
} 

9 réponses

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Une DLL devrait toujours être faite en C, pas en C++. On évite ainsi les éventuels problèmes de décoration du nom d'export de la fonction. Ok ça tombe impec, il n'y a pas un iota de C++ dans ton code.
Pour résumer, tu fais des fichiers *.c et tu règles la compil en C dans les options du compilo.

Ensuite tu supprimes ta série d'#include, seul <windows.h> suffit sur VC++.

Eviter les biniouteries du genre "__declspec(dllexport)" et autres machins qui masquent ce qu'on doit mettre. Au lieu de cela, tu préfixes à tout coup tes fonctions de __stdcall (ONLY en 32 bits, c'est __fastcall en x64) et tu exportes tes fonctions en les déclarant dans un fichier def.

En procédant ainsi on obtient toujours une DLL parfaitement conforme au standard API.

ciao...
BruNews, MVP VC++
Messages postés
176
Date d'inscription
mercredi 7 avril 2004
Statut
Membre
Dernière intervention
1 avril 2013
1
bonjour merci pour cette réponse
"biniouteries" j'ai recopié l'exemple qu'on m'avait donné, je n'ai changé que le coeur de la fonction.donc il me reste que :

//inclusion des fichiers nécessaires
#include<window.h>

export void __stdcall VariationTableau(unsigned char *PicBits2, unsigned char *PicBits, long nbElem, double coeff);

void __stdcall VariationTableau(unsigned char *PicBits2, unsigned char *PicBits, long nbElem, double coeff)
{
long dec;

    for(dec = 0;dec<nbElem;dec++)
    {
        PicBits[dec] = (unsigned char)(PicBits[dec])+(((unsigned char)(PicBits[dec])-(unsigned char)(PicBits2[dec])) * coeff);
    }
} 


ceci dans fichier main.c
dans les fichiers sources j'ai créé main.def contenant:

LIBRARY VariationTableau
EXPORTS
  VariationTableau


tu règles la compil en C dans les options du compilo.

je sais pas dans quel onglet exactement c'est??

puis pour compiler je fais générer la solution??
Messages postés
176
Date d'inscription
mercredi 7 avril 2004
Statut
Membre
Dernière intervention
1 avril 2013
1
rebonjour
j'avais fait une petite erreur window.h à la place windows.h
ceci réparé j'ai regénéré le projet mais dans les répertoires du projet je ne retrouve plus de dll
Messages postés
176
Date d'inscription
mercredi 7 avril 2004
Statut
Membre
Dernière intervention
1 avril 2013
1
cliqué trop vite
il me reste dans le répertoire debug le fichier VariationTableau.ilk
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Que comptes-tu faire du debug depuis VB ???

Compile en RELEASE.

ciao...
BruNews, MVP VC++
Messages postés
176
Date d'inscription
mercredi 7 avril 2004
Statut
Membre
Dernière intervention
1 avril 2013
1
je m'excuse mais j'ai du mal à suivre!!
en fait je veux transformer une dll qui avait été écrite en C ou C++ qui permettait d'ajouter une valeur à tout un tableau, ceci très rapidement voici le code d'origine
void __stdcall GradientTabloByte2(unsigned char *PicBits2, unsigned char *PicBits, long nbElem, double coeff)
{
long dec;

    for(dec = 0;dec<nbElem;dec++)
    {
        PicBits2[dec] = 229 + (unsigned char)((PicBits[dec]-229) * coeff);
    }
}


j'ai compris la programation en C++, je voulais transformer cette fonction pour additionner deux tableaux donc créé un autre code que tu as déjà vu. Mais mon problème c'est que je n'arrive pas à recréer une DLL!

je ne compte rien faire du debug, c'est dans ce répertoire que j'avais vu qu'il y avait tableauvariation.dll! c'est bien mon problème je ne sais ni créer cette dll ni la retrouver pour simplement la copier dans mon répertoire ou mon projet VB est inscrit!

en conclusion je voudrais un petit tutoriel pouyr créer cette dll avec mon bout de code. en suivant les différents tuto que j'ai vu j'arrive toujours à un momment ou je ne sais plus quoi faire (mon anglais à plus de 30ans)
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Dans ce zip:
http://brunews.com/GradTab.zip

tu auras:
- GradTab.dll qui exporte la fonction GradientTabloByte2().
- GradTab.xls qui contient le module VBA de test.

Tout semble aller impec.
Gaffe dans le "Declare Sub...", virer le chemin en dur que j'ai mis et place la dll où tu voudras.

POINT IMPORTANT:
- J'ai utilisé le jeu d'instructions SSE2 pour faire les MUL de flottants par 4, ça ne tournera donc pas sur des PCs de musée, à toi de voir.
- Regarde les colonnes A et B dans Excel avant de lancer, la A contient le résult de la DLL actuelle. Si résults de B te conviendraient mieux tu le dis et je recompile avec instructions en convert vers 0.

Voici ce qui est dans le module VB d'Excel:

Declare Sub GradientTabloByte2 Lib "E:\GradTab.dll" (pDest As Byte, pSrc As Byte, ByVal nElem As Long, ByVal dCoeff As Double)

Sub testDLL()
Dim btDst(24) As Byte, btSrc(24) As Byte
Dim i As Long
Dim b As Byte

For i = 0 To 23
btSrc(i) = b
b = b + 1
Next i

GradientTabloByte2 btDst(0), btSrc(0), 24, 2.4

For i = 0 To 23
Cells(i + 1, 1) = btDst(i)
Next i
End Sub


ciao...
BruNews, MVP VC++
Messages postés
176
Date d'inscription
mercredi 7 avril 2004
Statut
Membre
Dernière intervention
1 avril 2013
1
bonsoir
désolé je crois que je me suis mal fait comprendre je veux savoir faire moi même une dll avec visual C++ 2008 express la fonction qui sera dans ma dll je crois que je saurais la faire mais c'est le mode opératoire pour créer cette dll que je ne sais pas!!!
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Essaie en utilisant mes templates:
TEMPLATES C/C++ POUR VS 2008
http://www.cppfrance.com/code.aspx?ID=44835

Tu auras ainsi toutes les options configurées.

ciao...
BruNews, MVP VC++