Créer une dll a partir du C

Signaler
Messages postés
71
Date d'inscription
vendredi 20 juillet 2007
Statut
Membre
Dernière intervention
3 avril 2008
-
Messages postés
71
Date d'inscription
vendredi 20 juillet 2007
Statut
Membre
Dernière intervention
3 avril 2008
-
Salut,
Je cherche a crée une dll a partir d’un programme en c et
pas un exécutable. J’utilise visual c++.

Est-ce que quelqu’un à une idée ?

Merci

28 réponses

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Ben tu crées un projet Dll et pas exe.
Messages postés
71
Date d'inscription
vendredi 20 juillet 2007
Statut
Membre
Dernière intervention
3 avril 2008

oui mais sur visual c++, il ne me donne pas la possibilité de

choisir le type de projet.

est ce que tu sais comment choisir le type ?

merci
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
12
Quelle version de VS tu utilies? Version express?

AGILiCOMSavon
Messages postés
71
Date d'inscription
vendredi 20 juillet 2007
Statut
Membre
Dernière intervention
3 avril 2008

oui c'est visual c++ 2500 express edition
Messages postés
71
Date d'inscription
vendredi 20 juillet 2007
Statut
Membre
Dernière intervention
3 avril 2008

excuse visual c++ 2005 Express Edition
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
12
Va voir ce tutorial de racpp qui explique comment configurer VS2005 express.
Par défaut, tu ne peux pas générer de dll avec VS2005 express, mais en le configurant correctement, cela devient possible!

AGILiCOMSavon
Messages postés
71
Date d'inscription
vendredi 20 juillet 2007
Statut
Membre
Dernière intervention
3 avril 2008

salut,
je cherche à génerer un fichier .dll a partir d'un programme c pour le mettre dans mon programme java.
c'est la premiere fois où j'utilise visual c++.
j'ai crée un projet dll
dans le repertoire "source file" j'ai mon programme TestRapi.c :
************************************
#include "Test.h"
#include <windows.h>

 BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved){
        return TRUE;
    }

JNIEXPORT int JNICALL Java_Test_CeRapiInit (JNIEnv *env, jobject jtest) {
    return CeRapiInit();
}

***********************************************
dans le repertoire Header file j'ai le fichier Test.h

**********************************************
//* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Test */

#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Test
 * Method:    CeRapiInit
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_Test_CeRapiInit
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
*********************************************
 
aprés la compilation je ne trouve pas dans le projet le fichier .dll que je cherche.
je trouve projet.ncb , projet.sln, projet.suo.
est ce que vous avez une ideé ?
merci
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
12
Tu n'aurais pas un dossier "Debug" ou "Release" de créé?
Normalement, si il n'y a pas eu de probleme de compilation/linkage, la dll devrait se trouver dans un de ces répertoires.

AGILiCOMSavon
Messages postés
71
Date d'inscription
vendredi 20 juillet 2007
Statut
Membre
Dernière intervention
3 avril 2008

si j'ai bien le dossier Debug qui est crée main je n'ai pas la dll dedans.
je trouve dans ce dossier : buildLog.html, TestRapi.obj, vc80.idb et cv80.pdb
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
12
Es-tu sur de ne pas avoir d'erreurs de compilation ou de linkage?

AGILiCOMSavon
Messages postés
71
Date d'inscription
vendredi 20 juillet 2007
Statut
Membre
Dernière intervention
3 avril 2008

non
sur le fichier build.xml, j'ai ecrie ça pour avoir le fichier Test.h
*****************
 <target name="PDA" >
       <javah classpath="./build/web/........." verbose="yes" force="yes">
       <class name="Test"></class>
    </javah>
   </target>
**************************************
j'ai eu ce ficher sans erreur affichée :
*****************************************
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Test */

#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Test
 * Method:    CeRapiInit
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_Test_CeRapiInit
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
****************************************************
j'ai copié ce fichier dans le répertoire Header Files du projet c
dans le repertoire source files j'ai crée le ficher TestRapi.c
*****************************************
#include "Test.h"
#include <windows.h>

 BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved){
        return TRUE;
    }
JNIEXPORT int JNICALL Java_Test_CeRapiInit (JNIEnv *env, jobject jtest) {
    return CeRapiInit();
}
*************************************************
aprés la compilation j'ai les 2 warnings :
warning C4142: benign redefinition of type
warning C4013: 'CeRapiInit' undefined; assuming extern returning int
et je ne trouve pas le fichier .dll
Messages postés
71
Date d'inscription
vendredi 20 juillet 2007
Statut
Membre
Dernière intervention
3 avril 2008

salut,

sur visual c++, si je clique sur compile, j'ai aucune erreur mais je

ne trouve pas le fichier dll qui doit etre généré.

Quand j'ai cliqué sur Debug->start without Debugging : j'ai eu cette

erreur : error LNK2019: unresolved external symbol _CeRapiInit referenced in function _Java_Test_CeRapiInit@8

dans le dossier "Debug" j'ai trouve nomProjet.dll.embed.manifest,

nomProjet.dll.embed.manifest.res, nomProjet.dll.intermediate.manifest.

mais je n'ai pas le nomProjet.dll.

que penses tu?
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
12
OK, c'est bien ce qu'il me semblait, il y a une erreur de linkage.
Il ne trove pas ta fonction CeRapiInit.

Essaie en ne la mettant pas, tu devrais avoir ta dll.
Apres, il faut que tu trouves la libraire dans laquelle ta fonction se situe et que tu la lies à ton projet.

AGILiCOMSavon
Messages postés
71
Date d'inscription
vendredi 20 juillet 2007
Statut
Membre
Dernière intervention
3 avril 2008

salut,
voilà mon programme c
************************
#include "Test.h"
#include <windows.h>

 BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved){
        return TRUE;
    }

JNIEXPORT jint JNICALL Java_Test_CeRapiInit (JNIEnv *env, jobject jtest) {
  
   // return 1;
    return  CeRapiInit();
}
*******************************************************
Si je mets return 1 au lieu de return CeRapiInit(); j'ai pas d'erreur de compilation
et j'ai bien mon fichier NomProjet.dll.
la fonction CeRapiInit() se trouve dans une librairie rapi.dll.
Je ne sais pas comment la liée a mon projet ?
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
12
Essaie de trouver le fichier rapi.lib.
Mets le dans le répertoire de ton projet, puis dans ton code source, ecrit la ligne suivant:
#pragma comment(lib, "rapi.lib")

AGILiCOMSavon
Messages postés
71
Date d'inscription
vendredi 20 juillet 2007
Statut
Membre
Dernière intervention
3 avril 2008

salut,
rapi.dll c'est une librairie qui est installée dans le dossier system32 par activSync (un
logicuel qui fait la synchronisation entre pc et pda). j'ai cherché dans tous les dossier
mais je n'ai pas trouvé rapi.lib.
je ne sais pas comment faire?
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
12
Je crois avoir deja lu des problemes simialires au tien.
La librairie rapi.lib n'est pas inclue lors de l'install de VS2005 et ActiveSync, il faut aller la chercher dans un SDK de Windows Mobile.

<hr size= "2" width="100%" />ActiveSync—This is a Win32 (native) component and is responsible for
copying files from your desktop/computer to your device and vice versa.
The component makes extensive use of the RAPI library, which
can be found in the installation folder of the Windows Mobile 5.0
Pocket PC SDK. The same can be downloaded from the =83a52af2-f524-4ec5-9155-717cbe5d25ed&DisplayLang=en Windows Mobile Web site.
<hr size="2" width="100%" />
AGILiCOMSavon
Messages postés
71
Date d'inscription
vendredi 20 juillet 2007
Statut
Membre
Dernière intervention
3 avril 2008

salut,
Dans le dossier C:\Program Files\Microsoft Platform SDK\Lib j'ai trouvé le fichier :
Mprapi.lib et pas rapi.lib.
est ce que c'est le bon fichier ?
merci
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
12
Non, je ne crois pas.
Tu as téléchargé le SDK de Windows Mobile 5?
J'ai regardé rapidement, et il semble que rapi.ll ne se trouve que dans ce SDK. Un peu gros c'est vrai, mais bon...

AGILiCOMSavon
Messages postés
71
Date d'inscription
vendredi 20 juillet 2007
Statut
Membre
Dernière intervention
3 avril 2008

salut,
j'ai préféré de commencer par un exemple simple sans passé par la librairie rapi.dll.
pour ce la, j'ai défini une classe Test.java :
**********************************************
public class Test
{
   static {System.loadLibrary("Projet"); }
   public native int coucou();
    public Test(){}
}
***********************************************
a partir de cette classe je génere un fichier Test.h :
*********************************************
#include <jni.h>
#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jint JNICALL Java_Test_coucou
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
******************************************************
avec visual c++ j'ai crée un Projet que j'ai nommé "Projet"
j'ai un programme Test.c
****************************************
#include "Test.h"
 #include <windows.h>
 BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved){
        return TRUE;
    }

JNIEXPORT jint JNICALL Java_Test_CeRapiInit (JNIEnv *env, jobject jtest) {
   //je retourne une valeur egal à 1
    return 1;
}
************************************************************
en fin dans mon programme java, j'appele la methode coucou:
 Test obj = new Test();
  int c = obj.coucou();
et là il m'affiche cette erreur :
ERROR : java.lang.UnsatisfieldLinkError : coucou

je ne comprend pas, alors que l'exemple est simple, est ce que tu as une idée?

merci