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 :

Lecture d'une dll


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 217
    Points : 107
    Points
    107
    Par défaut Lecture d'une dll
    Bonjour,

    Je suis entrain de développer une application avec MVS 2010, j'essaye de me connecter une machine, j'ai la dll qu'il faut.

    Dans un premier temps je voudrais savoir si mon code est bon ou pas.

    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
     
    #include "stdafx.h"
     
    typedef OLECHAR FAR* BSTR;
     
    typedef bool (WINAPI* DLL_Function_Connect_Net) (BSTR, long); 
    ///typedef bool (WINAPI* DLL_Function_GetUserInfo) (int, int, string*, string*, int, bool); 
     
    DLL_Function_Connect_Net Connect_Net; 
    //DLL_Function_GetUserInfo GetUserInfo;
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	HINSTANCE HStpDll = LoadLibrary(_T("zkemsdk.dll"));
     
    	Connect_Net = (DLL_Function_Connect_Net)GetProcAddress( HStpDll, "Z_Connect_NET");
    	//GetUserInfo = (DLL_Function_GetUserInfo)GetProcAddress( HStpDll, "Z_GetUserInfo");
     
    	bool result = false;
     
    	cout << "Result [ " << result << " ]\n";
     
    	BSTR IP_adresse = SysAllocString(L"192.168.1.201");
    	char* IP_adresse_char = "192.168.1.201";
    	result = Connect_Net(IP_adresse, 4370);
     
    	cout << "Result [ " << result << " ]\n";
     
    	return 0;
    }
    L'erreur
    Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

  2. #2
    screetch
    Invité(e)
    Par défaut
    il vient d'où le WINAPI dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef bool (WINAPI* DLL_Function_Connect_Net) (BSTR, long);
    ?

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 217
    Points : 107
    Points
    107
    Par défaut
    Oui, c'est vrai enfaite il n'y a pas de WINAPI, Je l'ai oublié en copiant, mais ça n'a pas d'effet.

    Par contre la dll est en Visual Basic

  4. #4
    screetch
    Invité(e)
    Par défaut
    et tu as eu ou la declaration de Z_Connect_NET?
    j'ai réussi a le faire marcher mais ca ne ressemble pas a ce que tu dis...

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 217
    Points : 107
    Points
    107
    Par défaut
    Bain enfaite, cette fonction sert à se connecter à un appareil de contrôle d'accès. la dll se nomme "zkemsdk.dll", je ne sais pas si ça te dis quelque chose.

  6. #6
    screetch
    Invité(e)
    Par défaut
    ta bibliotheque est un controle ActiveX ou un bidule du genre, je n'ai pas tout compris.
    Toujours est il qu'il y a un vrai moyen, propre, de le faire marcher, c'est de coder comme ca:

    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
    #include <windows.h>
    #include <tchar.h>
    #include <iostream>
    #include <comdef.h>
    #include "zkemsdk.h"
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        HRESULT		hr;
        IZKEM	*zkem = NULL;
     
        // Now we will intilize COM
     
        hr = CoInitialize(0);
     
        // Use the SUCCEEDED macro and see if we can get a pointer 
     
        // to the interface
     
        if(SUCCEEDED(hr))
        {
            hr = CoCreateInstance( CLSID_CZKEM,
                        NULL,
                        CLSCTX_INPROC_SERVER,
                        IID_IZKEM, 
                        (void**) &zkem);
            VARIANT_BOOL result;
            BSTR IP_adresse = SysAllocString(L"192.168.1.201");
            const char* IP_adresse_char = "192.168.1.201";
            zkem->Connect_Net(IP_adresse, 4370, &result);
            std::cout << "Result [ " << result << " ]\n";
        }
     
     
        return 0;
    }
    avec les fichiers zkemsdk.h et zkemsdk_i.c générés a partir de la DLL.

    Dans l'ordre:
    * ouvre un CommandPrompt visual studio (celui que tu as, peu importe)
    * cd repertoire/du/sdk
    * regsvr32 zkemkeeper.dll
    * OleView.exe

    la, étend Type Libraries (le troisième... triangle, truc)
    tout a la fin tu devrais voir ta DLL, ZKEMKeeper
    double clic dessus
    il va te donner une fenetre avec du code IDL
    copie-colle le code IDL dans un fichier texte, zkemsdk.idl

    dans le command prompt:
    * midl zkemsdk.idl /h zkemsdk.h
    ca va générer un fichier .c et un fichier .h
    ajoute les deux a ton projet
    change le code avec ce que j'ai plus haut, qui est du "code" COM
    et hop, ca marche

  7. #7
    screetch
    Invité(e)
    Par défaut
    j'ai oublié de préciser mais le code plus haut est malpropre, il faut aussi appeler Release() sur l'interface et appeler CoUninitialize a la fin...
    aussi, si tu veux redistribuer ton application, il faudra installer zkemkeeper avec, et appeler regsvr32 sur les machines client.

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 217
    Points : 107
    Points
    107
    Par défaut
    Merci pour ta réponse, je vais voir tous ça et je te dirais, merci beaucoup.

  9. #9
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    217
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 217
    Points : 107
    Points
    107
    Par défaut
    Merci ça m'a beaucoup aidé, et j'ai réussi à établir une connexion.

  10. #10
    screetch
    Invité(e)
    Par défaut
    de rien
    (mets des )

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Je travail actuellement sur un projet qui me pareit tres proche de asoka13.
    J'ai une badgeuse (Time Card Machine HF-S200), que je dois faire communiquer en serie (port COM) avec un systeme embarque Unix en C++.

    Il y a des librairies DLL qui sont fournis avec ("zkemsdk.dll").
    Mais je n'arrive pas a la faire fonctionner !

    J'ai suivi les instructions de screetch, mais impossible de generer les fichier .idl/.h/.c a partir du .dll.
    J'ai un message d'erreur dans OleView quand je double clic sur "ZKEMKeeper 6.0 Control (Ver 1.0)" : "DllRegisterServer in IVIEWER.DLL failed. OLEViewe will operate correctly without this DLL, however you will not be able to use the interface viewers."

    Si asoka13 pouvait me fournir les fichiers .idl/.h/.c qu'il a reussis a généré, cela m'aiderai VRAIMENT BEAUCOUP.
    Je suis actuellement bloqué!

    Merci d'avance.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Je viens de generer mon fichier zkemsdk.idl dans OleView (je n'avais pas lance OleView avec les droits administrateur, desole).

    Par contre maintenant j'essaye d'utiliser la commande midl, mais Windows ne la trouve nul part.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    J'ai trouvé midl.exe, mais j'ai tout le temps des erreurs.
    J'ai tout essayé, j'ai bien bidouiller avec se que j'ai pu trouver sur les forums a droite, a gauche, sans succes.

    1er essai :
    >cd "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin"
    >copy "C:\Users\David\Desktop\zkemsdk.idl" ./zkemsdk.idl
    >midl zkemsdk.idl /h zkemsdk.h
    C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin>midl zkemsdk.idl /h zkemsdk.h
    Microsoft (R) 32b/64b MIDL Compiler Version 7.00.0500
    Copyright (c) Microsoft Corporation 1991-2006. All rights reserved.
    Processing .\zkemsdk.idl
    midl : command line error MIDL1005 : cannot find C preprocessor cl.exe

    2eme essai :
    >cd "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\ce\bin\x86_sh"
    >copy "C:\Users\David\Desktop\zkemsdk.idl" ./zkemsdk.idl
    >midl zkemsdk.idl /h zkemsdk.h
    Microsoft (R) 32b/64b MIDL Compiler Version 5.03.0286
    Copyright (c) Microsoft Corp 1991-2000. All rights reserved.
    Processing .\zkemsdk.idl
    midl : command line error MIDL1003 : error returned by the C preprocessor (-1073741515)

    Avec 3 messages popup d'erreur :
    "cl.exe - Unable To Locate Component : This application has failed to start because mspdb80.dll was not found. Re-installing the application may fix this problem."
    "Microsoft C/C++ Compiler Driver has stopped working"
    "Platform Builder Midlc compiler has stopped working"

    3eme essai :
    >cd "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin"
    >copy "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\msobj80.dll" ./msobj80.dll
    >copy "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\mspdb80.dll" ./mspdb80.dll
    >copy "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\mspdbcore.dll" ./mspdbcore.dll
    >copy "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\mspdbsrv.exe" ./mspdbsrv.exe
    >copy "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\ce\bin\x86_sh\midl.exe" ./midl.exe
    >copy "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\ce\bin\x86_sh\midlc.exe" ./midlc.exe
    >copy "C:\Users\David\Desktop\zkemsdk.idl" ./zkemsdk.idl
    >midl zkemsdk.idl /h zkemsdk.h
    Microsoft (R) 32b/64b MIDL Compiler Version 5.03.0286
    Copyright (c) Microsoft Corp 1991-2000. All rights reserved.
    Processing .\zkemsdk.idl
    zkemsdk.idl
    midl : command line error MIDL1001 : cannot open input file oaidl.idl

    >copy "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\*.*" "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\*.*"
    >midl zkemsdk.idl /h zkemsdk.h
    Microsoft (R) 32b/64b MIDL Compiler Version 5.03.0286
    Copyright (c) Microsoft Corp 1991-2000. All rights reserved.
    Processing .\zkemsdk.idl
    zkemsdk.idl
    Processing .\oaidl.idl
    oaidl.idl
    Processing .\objidl.idl
    objidl.idl
    Processing .\unknwn.idl
    unknwn.idl
    Processing .\wtypes.idl
    wtypes.idl
    Processing .\basetsd.h
    basetsd.h
    Processing .\guiddef.h
    guiddef.h
    .\unknwn.idl(108) : error MIDL2025 : syntax error : expecting ] or , near "annotation"
    .\unknwn.idl(108) : error MIDL2026 : cannot recover from earlier syntax errors;
    aborting compilation

    Je viens de mettre a jour "Microsoft® Windows® Software Development Kit".

    Et je galere toujours ...

  14. #14
    screetch
    Invité(e)
    Par défaut
    il y a dans le Windows SDK un fichier "Command Prompt", c'est cela qu'il faut lancer. Tu peux le trouver dans le menu démarrer => Windows SDK => quelque part dans les outils, lance le command prompt.
    Tu ne devrais pas copier les DLL d'un repertoire a l'autre, je te conseille de remettre comme c'était

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par screetch Voir le message
    il y a dans le Windows SDK un fichier "Command Prompt", c'est cela qu'il faut lancer. Tu peux le trouver dans le menu démarrer => Windows SDK => quelque part dans les outils, lance le command prompt.
    Tu ne devrais pas copier les DLL d'un repertoire a l'autre, je te conseille de remettre comme c'était
    Merci pour ta reponse screetch.
    Je suis reparti de zero.
    J'ai desinstaller tous les SDK et outils de dev que j'avais sur ma machine, et remis tout a jour.
    J'ai lance le "CMD Shell" qui se trouve dans "Microsoft Windows SDK v6.1", avec les droits administrateur.
    Et c'est bon, ca a bien marche cette fois !

    Setting SDK environment relative to C:\Program Files\Microsoft SDKs\Windows\v6.1.
    Targeting Windows Server 2008 x64 DEBUG
    C:\Windows\system32>copy "C:\Users\David\Desktop\zkemsdk.idl" ./zkemsdk.idl
    100% copied 1 file(s) copied.
    C:\Windows\system32>midl zkemsdk.idl /h zkemsdk.h
    Microsoft (R) 32b/64b MIDL Compiler Version 7.00.0500
    Copyright (c) Microsoft Corporation 1991-2006. All rights reserved.
    64 bit Processing .\zkemsdk.idl
    zkemsdk.idl
    64 bit Processing C:\Program Files\Microsoft SDKs\Windows\v6.1\Include\oaidl.idl
    oaidl.idl
    64 bit Processing C:\Program Files\Microsoft SDKs\Windows\v6.1\Include\objidl.idl
    objidl.idl
    64 bit Processing C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\Include\unknwn.idl
    unknwn.idl
    64 bit Processing C:\Program Files\Microsoft SDKs\Windows\v6.1\Include\wtypes.idl
    wtypes.idl
    64 bit Processing C:\Program Files\Microsoft SDKs\Windows\v6.1\Include\basetsd.h
    basetsd.h
    64 bit Processing C:\Program Files\Microsoft SDKs\Windows\v6.1\Include\guiddef.h
    guiddef.h
    64 bit Processing C:\Program Files\Microsoft SDKs\Windows\v6.1\Include\oaidl.acf
    oaidl.acf

    Il m'a bien genere les fichiers .h/.c/.tlb.

    Maintenant je suis dans Microsoft Visual Studio 2008, pour essayer de faire marcher un code en C utilisant ces fichiers.
    La semaine va etre longue ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur de lecture d'une dll
    Par matimatiksa dans le forum Simulink
    Réponses: 2
    Dernier message: 03/05/2015, 20h07
  2. realisation d une dll de lecture de memoire RAM
    Par mat26400 dans le forum Visual C++
    Réponses: 9
    Dernier message: 05/01/2007, 11h23
  3. Declarer une dll Delphi ?
    Par DelphiCool dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/07/2002, 10h07
  4. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07
  5. Lecture d'une image bitmap
    Par Geronimo dans le forum x86 32-bits / 64-bits
    Réponses: 18
    Dernier message: 28/06/2002, 12h01

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