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

cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 - 12 déc. 2009 à 15:41
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 14 déc. 2009 à 18:56
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

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
12 déc. 2009 à 19:27
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++
0
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 1
12 déc. 2009 à 21:46
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??
0
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 1
12 déc. 2009 à 21:50
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
0
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 1
12 déc. 2009 à 21:52
cliqué trop vite
il me reste dans le répertoire debug le fichier VariationTableau.ilk
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 déc. 2009 à 09:40
Que comptes-tu faire du debug depuis VB ???

Compile en RELEASE.

ciao...
BruNews, MVP VC++
0
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 1
13 déc. 2009 à 11:32
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)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 déc. 2009 à 20:17
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++
0
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 1
14 déc. 2009 à 18:51
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!!!
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
14 déc. 2009 à 18:56
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++
0
Rejoignez-nous