IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[Vista][VS 2005 express] erreur "dll import non autorisée"


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Points : 4
    Points
    4
    Par défaut [Vista][VS 2005 express] erreur "dll import non autorisée"
    Bonjour à tous,

    Voilà mon code:

    source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
     
    #include "stdafx.h"
    #include <stdio.h>
    #define EXPORTING_simplem 1
    #include "simplem.h"
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    extern mclComponentData __MCC_simplem_component_data;
     
    #ifdef __cplusplus
    }
    #endif
     
     
    static HMCRINSTANCE _mcr_inst = NULL;
     
     
    #if defined( _MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__) || defined(__LCC__)
    #ifdef __LCC__
    #undef EXTERN_C
    #endif
    #include <windows.h>
     
    static char path_to_dll[_MAX_PATH];
     
    BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, void *pv)
    {
        if (dwReason == DLL_PROCESS_ATTACH)
        {
            char szDllPath[_MAX_PATH];
            char szDir[_MAX_DIR];
            if (GetModuleFileName(hInstance, szDllPath, _MAX_PATH) > 0)
            {
                 _splitpath(szDllPath, path_to_dll, szDir, NULL, NULL);
                strcat_s(path_to_dll, szDir);
            }
    	else return FALSE;
        }
        else if (dwReason == DLL_PROCESS_DETACH)
        {
        }
        return TRUE;
    }
    #endif
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    static int mclDefaultPrintHandler(const char *s)
    {
      return mclWrite(1 /* stdout */, s, sizeof(char)*strlen(s));
    }
     
    #ifdef __cplusplus
    } /* End extern "C" block */
    #endif
     
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    static int mclDefaultErrorHandler(const char *s)
    {
      int written = 0;
      size_t len = 0;
      len = strlen(s);
      written = mclWrite(2 /* stderr */, s, sizeof(char)*len);
      if (len > 0 && s[ len-1 ] != '\n')
        written += mclWrite(2 /* stderr */, "\n", sizeof(char));
      return written;
    }
     
    #ifdef __cplusplus
    } /* End extern "C" block */
    #endif
     
    /* This symbol is defined in shared libraries. Define it here
     * (to nothing) in case this isn't a shared library. 
     */
    #ifndef LIB_simplem_C_API 
    #define LIB_simplem_C_API /* No special import/export declaration */
    #endif
     
    LIB_simplem_C_API 
    bool MW_CALL_CONV simplemInitializeWithHandlers(
        mclOutputHandlerFcn error_handler,
        mclOutputHandlerFcn print_handler
    )
    {
      if (_mcr_inst != NULL)
        return true;
      if (!mclmcrInitialize())
        return false;
      if (!mclInitializeComponentInstance(&_mcr_inst, &__MCC_simplem_component_data,
                                          true, NoObjectType, LibTarget,
                                          error_handler, print_handler))
        return false;
      return true;
    }
     
    LIB_simplem_C_API 
    bool MW_CALL_CONV simplemInitialize(void)
    {
      return simplemInitializeWithHandlers(mclDefaultErrorHandler,
                                           mclDefaultPrintHandler);
    }
     
    LIB_simplem_C_API 
    void MW_CALL_CONV simplemTerminate(void)
    {
      if (_mcr_inst != NULL)
        mclTerminateInstance(&_mcr_inst);
    }
     
    LIB_simplem_C_API 
    void MW_CALL_CONV simplemPrintStackTrace(void) 
    {
      char** stackTrace;
      int stackDepth = mclGetStackTrace(_mcr_inst, &stackTrace);
      int i;
      for(i=0; i<stackDepth; i++)
      {
        mclWrite(2 /* stderr */, stackTrace[i], sizeof(char)*strlen(stackTrace[i]));
        mclWrite(2 /* stderr */, "\n", sizeof(char)*strlen("\n"));
      }
      mclFreeStackTrace(&stackTrace, stackDepth);
    }
     
     
    LIB_simplem_C_API 
    bool MW_CALL_CONV mlxSimplem(int nlhs, mxArray *plhs[],int nrhs, mxArray *prhs[])
    {
      return mclFeval(_mcr_inst, "simplem", nlhs, plhs, nrhs, prhs);
    }
     
    LIB_simplem_CPP_API 
    void MW_CALL_CONV simplem(int nargout, mwArray& z, const mwArray& x, const mwArray& y)
    {
      mclcppMlfFeval(_mcr_inst, "simplem", nargout, 1, 2, &z, &x, &y);
    }
    header
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    #ifndef __simplem_h
    #define __simplem_h 1
     
     
    #ifdef MX_COMPAT_32_OFF
    #ifdef MX_COMPAT_32
    #undef MX_COMPAT_32
    #endif
    #else
    #ifndef MX_COMPAT_32
    #define MX_COMPAT_32
    #endif
    #endif
    #if defined(__cplusplus) && !defined(mclmcr_h) && defined(__linux__)
    #  pragma implementation "mclmcr.h"
    #endif
    #include "mclmcr.h"
    #include "mclcppclass.h"
    #ifdef __cplusplus
    extern "C" {
    #endif
     
    #if defined(__SUNPRO_CC)
    /* Solaris shared libraries use __global, rather than mapfiles
     * to define the API exported from a shared library. __global is
     * only necessary when building the library -- files including
     * this header file to use the library do not need the __global
     * declaration; hence the EXPORTING_<library> logic.
     */
     
    #ifdef EXPORTING_simplem
    #define PUBLIC_simplem_C_API __global
    #else
    #define PUBLIC_simplem_C_API /* No import statement needed. */
    #endif
     
    #define LIB_simplem_C_API PUBLIC_simplem_C_API
     
    #elif defined(_HPUX_SOURCE)
     
    #ifdef EXPORTING_simplem
    #define PUBLIC_simplem_C_API __declspec(dllexport)
    #else
    #define PUBLIC_simplem_C_API __declspec(dllimport)
    #endif
     
    #define LIB_simplem_C_API PUBLIC_simplem_C_API
     
     
    #else
     
    #define LIB_simplem_C_API
     
    #endif
     
    /* This symbol is defined in shared libraries. Define it here
     * (to nothing) in case this isn't a shared library. 
     */
    #ifndef LIB_simplem_C_API 
    #define LIB_simplem_C_API /* No special import/export declaration */
    #endif
     
    extern LIB_simplem_C_API 
    bool MW_CALL_CONV simplemInitializeWithHandlers(mclOutputHandlerFcn error_handler,
                                                    mclOutputHandlerFcn print_handler);
     
    extern LIB_simplem_C_API 
    bool MW_CALL_CONV simplemInitialize(void);
     
    extern LIB_simplem_C_API 
    void MW_CALL_CONV simplemTerminate(void);
     
     
     
    extern LIB_simplem_C_API 
    void MW_CALL_CONV simplemPrintStackTrace(void);
     
     
    extern LIB_simplem_C_API 
    bool MW_CALL_CONV mlxSimplem(int nlhs, mxArray *plhs[],
                                 int nrhs, mxArray *prhs[]);
     
    #ifdef __cplusplus
    }
    #endif
     
    #ifdef __cplusplus
     
    /* On Windows, use __declspec to control the exported API */
    #if defined(_MSC_VER) || defined(__BORLANDC__)
     
    #ifdef EXPORTING_simplem
    #define PUBLIC_simplem_CPP_API __declspec(dllexport)
    #else
    #define PUBLIC_simplem_CPP_API __declspec(dllimport)
    #endif
     
    #define LIB_simplem_CPP_API PUBLIC_simplem_CPP_API
     
    #else
     
    #if !defined(LIB_simplem_CPP_API)
    #if defined(LIB_simplem_C_API)
    #define LIB_simplem_CPP_API LIB_simplem_C_API
    #else
    #define LIB_simplem_CPP_API /* empty! */ 
    #endif
    #endif
     
    #endif
     
    extern LIB_simplem_CPP_API void MW_CALL_CONV simplem(int nargout, mwArray& z
                                                         , const mwArray& x
                                                         , const mwArray& y);
     
    #endif
     
    #endif
    A la compilation, je reçois l'erreur suivante:

    simplemvs\simplem.cpp(146) : error C2491: 'simplem'*: définition de fonction dllimport non autorisée
    Le code est en fait un fichier wrapper pour la fonction matlab simplem (bête fonction de test), donc évidemment il est assez complexe et pas très lisible.

    Comment résoudre ce problème?

    Merci beaucoup!

  2. #2
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Tu peux déclarer une fonction avec __declspec(dllimport) mais tu ne peux pas la définir tout en gardant le __declspec(dllimport).
    Essaie de virrer les __declspec(dllimport) là où tu définis tes fonctions.

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Alors j'ai essayé quelque chose..

    l'erreur est ici (.cpp):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    LIB_simplem_CPP_API 
    void MW_CALL_CONV simplem(int nargout, mwArray& z, const mwArray& x, const mwArray& y)
    {
      mclcppMlfFeval(_mcr_inst, "simplem", nargout, 1, 2, &z, &x, &y);
    }
    LIB_simplem_CPP_API est une macro, on le voit ici (.h):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef EXPORTING_simplem
    #define PUBLIC_simplem_CPP_API __declspec(dllexport)
    #else
    #define PUBLIC_simplem_CPP_API __declspec(dllimport)
    #endif
    Il y a donc apparemment bien un __declspec(dllimport) au moment de la définition de la fonction à cause de la macro.

    J'ai essayé de commenter la ligne LIB_simplem_CPP_API dans le cpp,
    j'obtiens alors un warning:
    simplemvs\simplem.cpp(146) : warning C4273: 'simplem'*: liaison DLL incohérente
    et finalement un erreur pendant l'édition des liens:
    simplem.obj : error LNK2001: symbole externe non résolu ___MCC_simplem_component_data
    1>C:\Users\erwan\ENSTA\PPL\simplemVS\simplemVS\Debug\simplemVS.exe : fatal error LNK1120: 1 externes non résolus
    Je ne sais pas si l'erreur de linkage est liée..

    Quelqu'un a-t-il une inspiration?

    Merci

  4. #4
    screetch
    Invité(e)
    Par défaut
    essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifdef EXPORTING_simplem
    #define PUBLIC_simplem_CPP_API __declspec(dllexport)
    #else
    #error "On est censé exporter la..."
    #endif
    Si ca fait une erreur sur le #error ca veut dire que EXPORTING_simplem n'est pas défini au moment de l'inclusion. Il est peut etre inclus dans stdafx.h?
    Si c'est le cas, ajoute dans la compilation des fichiers CPP la macro EXPORTING_simplem directement

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bon, en reprenant pour mon code pour tester tes suggestions, je me suis dit que je devrais aussi essayer de reconstruire le projet sans stdafx.h et les fichiers que VC++ crée automatiquement.
    Je ne me sers pas habituellement de VC++ et tout ça était obscure.

    j'ai donc ouvert un autre projet complètement vide (j'avais pas vu ce choix avant). Cette fois-ci plus d'erreurs, seulement 5 warnings,
    et le programme s'éxécute bien!!!

    Par contre, je poste le log, ces warnings ne sont pas là pour me rassurer...

    Merci, en tout cas pour les suggestions précédentes.

    log:

    Compilation en cours...
    simplem_mcc_component_data.c
    Compilation en cours...
    simplemVS.cpp
    c:\program files\matlab\extern\include\mclmcr.h(1351) : warning C4267: 'return' : conversion de 'size_t' en 'mwSize', perte possible de données
    simplem.cpp
    c:\program files\matlab\extern\include\mclmcr.h(1351) : warning C4267: 'return' : conversion de 'size_t' en 'mwSize', perte possible de données
    c:\users\erwan\ensta\ppl\simplem_test\simplem.cpp(41) : warning C4996: '_splitpath': This function or variable may be unsafe. Consider using _splitpath_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    c:\program files\microsoft visual studio 8\vc\include\stdlib.h(822) : voir la déclaration de '_splitpath'
    c:\users\erwan\ensta\ppl\simplem_test\simplem.cpp(42) : warning C4996: 'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    c:\program files\microsoft visual studio 8\vc\include\string.h(79) : voir la déclaration de 'strcat'
    Génération de code en cours...
    Édition des liens en cours...
    Création de la bibliothèque C:\Users\erwan\ENSTA\PPL\simplem_test\simplem\Debug\simplem.lib et de l'objet C:\Users\erwan\ENSTA\PPL\simplem_test\simplem\Debug\simplem.exp
    simplemVS.obj : warning LNK4217: symbole défini localement ?simplem@@YAXHAAVmwArray@@ABV1@1@Z (void __cdecl simplem(int,class mwArray &,class mwArray const &,class mwArray const &)) importé dans la fonction "int __cdecl run_main(int,char * *)" (?run_main@@YAHHPAPAD@Z)
    Incorporation du manifeste en cours...

  6. #6
    screetch
    Invité(e)
    Par défaut
    les 2 premiers sont des warning de types, le type mwSize est défini probablement comme un unsigned int a vue de nez, et c'est plus petit que size_t. assure toi d'utiliser le mnSize au lieu de size_t si c'est toi qui a utilisé size_t, si ca vient de la STL il faudrait redefinir mnSize en size_t si c'est possible, sinon... un vilain cast.

    Le deuxieme, certaines fonctions C ont été marquées comme dangereuses, je sais pas si c'est vrai ou pas. Si ton code doit etre portable (linux/solaris/je sais pas quoi) alors le mieux c'est d'aller verifier l'utilisation de tes strcat/splitpath, de vérifier qu'il n'y a pas d'erreur de codage, et soit de définir _CRT_SECURE_NO_WARNINGS (dans ce cas tu dis au compilateur ce que tu fais) soit laisser les warning.

    Le dernier, c'est parce que tu as marqué une fonction (dllimport) mais en fait elle n'a pas eu besoin d'etre importée. Tu as sans doute un probleme avec ta macro d'import, je suppose (sans etre certain) que tu as mis un fichier main.c dans ton projet pour le tester. Mais le projet etait censé etre une DLL qui exportait des symboles, et tu l'as transformé en exe, du coup il n'y a plus besoin d'importer les fonctions de la DLL. bon je me sens pas tres tres clair sur ce coup, je me comprends, si pas toi... bah on verra demain matin

  7. #7
    Candidat au Club
    Inscrit en
    Juillet 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    hei

    Je suis pas sure d'avoir saisi, effectivement.

    Donc quelle serait l'utilisation normale? Mon but, c'est de pouvoir appeler, une fonction de la DLL (fonction Matlab en fait) dans mon projet.

    Ce que j'ai mis en ligne est un essai. Et je ne sais pas en fait comment intégrer, appeler depuis un projet différent. Le projet "général" est un petit logiciel. J'ai pour l'instant codé une interface graphique avec la lib. L'idéal serait de pouvoir appeler cette fonction matlab emballée dans la DLL, depuis cette interface graphique.

    Le main de l'essai est de cette forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main()
    {
    	mclmcrInitialize();
        return mclRunMain((mclMainFcnType)run_main,0,NULL);
    }
    Evidemment, dans le projet Qt, le main se termine par return app.exec()...

    Comment concilier les deux?

    En tout cas, merci pour les réponses à propos des warning!

Discussions similaires

  1. erreur IIS dll code non managé
    Par toams69 dans le forum IIS
    Réponses: 0
    Dernier message: 07/07/2011, 18h12
  2. Visual c++ 2005 express Erreur de génération
    Par jejedi95 dans le forum Visual C++
    Réponses: 3
    Dernier message: 15/06/2007, 11h43
  3. Erreur ASP 0104 Opération non autorisée
    Par mister_rom dans le forum ASP
    Réponses: 5
    Dernier message: 08/02/2007, 10h50
  4. Réponses: 1
    Dernier message: 02/11/2006, 20h09
  5. [SQL Server 2005 Express][import-export Excel]
    Par Marco_SAP dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 31/12/2005, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo