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

WinDev Discussion :

Utilisation d'une DLL avec classes


Sujet :

WinDev

  1. #1
    Invité
    Invité(e)
    Par défaut Utilisation d'une DLL avec classes
    Bonjour,
    je voudrais me servir d'une méthode présente dans ma dll asd100.dll, j'avais fais un test en vb.net, j'ai pu le faire sans soucis :

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim test As New ASD100Lib.Cial
    Dim qte As Integer = test.StockQte(1, "BAAR01", 0, 0, Date.Now)

    Maintenant, je voudrais retranscrire ce code en wlangage mais je n'y arrive pas, je ne sais pas s'il s'agit ou non d'un assemblage .NET...

    Quand je fais ce code:
    Code wlangage : Sélectionner tout - Visualiser dans une fenêtre à part
    AppelDLL32("asd100.dll","StockQte",vDepot, COL_REF[l_i], 0, 0, DateDuJour)

    J'obtiens cette erreur :
    La fonction 'StockQte' n'a pas été trouvée dans la DLL asd100.dll
    Détail de l'erreur système : La procédure spécifiée est introuvable.
    Je fais comment?
    Merci

    edit: en retournant dans visual studio, en regardant dans les références, VS dit qu'il s'agit d'une DLL de type COM
    Dernière modification par Invité ; 02/02/2015 à 15h02.

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    Je pense que ta DLL doit être déclarée sur le système (registrée) DONC il faut faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    toto est un objet Automation dynamique
     
    toto = allouer un objet Automation "ASD100Lib.Cial"
     
    toto>>StockQte(....)
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  3. #3
    Invité
    Invité(e)
    Par défaut
    J'obtiens l'erreur suivante :
    L'objet automation 'ASD100Lib.Cial' n'est pas installée sur votre système
    Je fais comment?

  4. #4
    Membre éclairé
    Avatar de Narwe
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 253
    Points : 668
    Points
    668
    Par défaut
    Peut-être qu'en essayant de passer par la fonction ChargeDLL tu auras un message d'erreur qui pourra donner une piste de résolution du problème : http://doc.pcsoft.fr/fr-FR/?3014006

    Sinon, j'essayerais de faire une fonction simple dans une autre DLL (a priori, créé des DLL ne te pose pas de problème).
    la première sans paramètre
    la deuxième avec uniquement un paramètre numérique
    la troisième avec un paramètre texte

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    Citation Envoyé par romulus001 Voir le message
    J'obtiens l'erreur suivante :


    Je fais comment?
    Ok la DLL n'est pas registrée...

    Donc je pense qu'il faut que tu revoie ton interface COM (...et ça j'y connais rien) et peut être évité d'encapsuler ton fonction dans un objet...
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Narwe Voir le message
    Peut-être qu'en essayant de passer par la fonction ChargeDLL tu auras un message d'erreur qui pourra donner une piste de résolution du problème : http://doc.pcsoft.fr/fr-FR/?3014006

    Sinon, j'essayerais de faire une fonction simple dans une autre DLL (a priori, créé des DLL ne te pose pas de problème).
    la première sans paramètre
    la deuxième avec uniquement un paramètre numérique
    la troisième avec un paramètre texte
    Justement, j'avais essayé ce bout de code:
    Code wlangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    hInst est un entier = ChargeDLL( "asd100.dll") // valeur récupérée : 130482176
    l_res est un entier=0
    SI 	hInst=0 ALORS
    	Erreur(ErreurInfo())
    SINON
    	l_res  = AppelDLL32("asd100.dll","StockQte",vDepot, COL_REF[l_i], 0, 0, DateDuJour)
    	DéchargeDLL(hInst)
    FIN

    J'obtiens un plantage lors de l'appel de la fonction AppelDLL32, comme je l'ai précisé dans mon message initial.

    Citation Envoyé par michel.souris
    Ok la DLL n'est pas registrée...

    Donc je pense qu'il faut que tu revoie ton interface COM (...et ça j'y connais rien) et peut être évité d'encapsuler ton fonction dans un objet...
    J'ai regardé l'unique commentaire laissé sur cette page: http://doc.pcsoft.fr/fr-FR/?1514015
    Ce qui m'a amené à écrire le code suivant:
    Code wlangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    API("Ole32.DLL","CoInitializeEx",Null,0) // Appel à la fonction : initialisation de la bibliothèque COM
    l_test est un objet Automation dynamique 
    l_test = allouer un objet Automation "ASD100Lib.Cial"
    l_res est un entier= l_test>>StockQte(1, "BAAR01", 0, 0, DateDuJour)
    libérer l_test
    API("Ole32.DLL","CoUninitialize") // Toujours accompagné un "CoInitializeEx" par "CoUninitialize" !

    Mais j'obtiens un plantage à cause de la ligne suivante:
    l_test = allouer un objet Automation "ASD100Lib.Cial"
    Le message d'erreur dit que l'objet automation n'est pas installé...

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    Si tu fais un regasm ou regsrv32 de ta DLL ça ne change pas ?
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par michel.souris
    Si tu fais un regasm ou regsrv32 de ta DLL ça ne change pas ?
    je ne connais aucune des 2 méthodes, ça fait quoi et comment je dois m'y prendre?

  9. #9
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2009
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 278
    Points : 2 151
    Points
    2 151
    Par défaut
    https://msdn.microsoft.com/fr-fr/lib...vs.110%29.aspx

    De ce que j'en sais/comprends, ça déclare l'objet au niveau système (je suis pas un spécialiste par contre)...
    SQL : le véritable Esperanto

    "Les patates à ta tata épatent ton tonton mais les pates aux thons à ton tonton épatent pas ta tata." (Michel Souris)

    MERCI DE NE PAS M'ENVOYER DE MESSAGE PRIVE POUR DES QUESTIONS TECHNIQUES SANS MON ACCORD !

  10. #10
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    hello,
    s'il s'agit du KIT ODBC Sage voici ce que j'ai trouvé :

    Sage offers an ODBC driver to connect to their proprietary databases. Here we talk about using the supplied ActiveX performing advanced functions in a .Net C# application.
    A connection to the ODBC data source must be made prior to using the advanced functions provided by the ActiveX.
    Using the ActiveX DLL in C#
    An assembly of the ActiveX dll must be created before it can be used in a .Net program.
    After installing the Sage Ligne 100 ODBC Kit and the .Net 1.1 SDK, use the library converter:
    cd "C:\Program Files\Microsoft.NET\SDK\v1.1\Bin"
    tlbimp %WINDIR%\system32\ASD100.dll /out:%WINDIR%\system32\ASD100lib.dll
    Test the newly created assembly with:
    Ildasm %WINDIR%\system32\ASD100Lib.dll
    The library can then be added to the C# project as a normal assembly. See the links below for details.
    donc si tu as à la fois asd100.dll et asd100lib.dll sur ton système asd100lib est un assemblage dotnet qu'il faut importer dans ton projet voir ici et l'utiliser en tant que tel.

    Sinon si tu veux utiliser l'activex asd100.dll voir ici

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  11. #11
    Invité
    Invité(e)
    Par défaut
    Je me sers de la version 17.50 de l'odbc, je n'ai pas trouvé cette dll à l'adresse indiqué, ni le nom en lui même, j'ai pu trouver Interop.ASD100Lib.dll dans SysWoW64

    J'ai pu ajouté sans soucis cette nouvelle DLL dans mon projet, j'ai pu trouver la méthode que je voulais, bizarrement, elle s'appelle ici get_StockQte (dans d'autres dll, c'était soit CIALStockQte, soit StockQte).

    Cependant, je rencontre des difficultés pour utiliser cette méthode, disant que je ne respecte pas la syntaxe, je ne comprends plus rien...

    Mon code:
    Code wlangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    l_qteStock est un réel
    l_test est un objet ASD100Lib.CialClass
    l_qteStock=l_test.get_StockQte(1,"COR1",0,0,DateDuJour)

    En regardant dans la description de la méthode, je trouve cela:

    Code wlangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // get_StockQte
    //
    // Paramètres :
    //	DE_No : entier
    //	AR_Ref : chaîne UNICODE
    //	AG_No1 : entier
    //	AG_No2 : entier
    //	dDate : dateheure
    // Valeur de retour :
    //	réel
     
    [ <Résultat> = ] get_StockQte (LOCAL DE_No est un(e) entier, LOCAL AR_Ref est un(e) chaîne UNICODE, LOCAL AG_No1 est un(e) entier, LOCAL AG_No2 est un(e) entier, LOCAL dDate est un(e) dateheure)
    Dernière modification par Invité ; 05/02/2015 à 16h00.

  12. #12
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 951
    Points : 9 280
    Points
    9 280
    Par défaut
    Chat lu ,

    je ne pense pas que la dll interop.... soit le bon assemblage il faudrait que tu fasses ceci :
    Using the ActiveX DLL in C#
    An assembly of the ActiveX dll must be created before it can be used in a .Net program.
    After installing the Sage Ligne 100 ODBC Kit and the .Net 1.1 SDK, use the library converter:
    cd "C:\Program Files\Microsoft.NET\SDK\v1.1\Bin"
    tlbimp %WINDIR%\system32\ASD100.dll /out:%WINDIR%\system32\ASD100lib.dll
    Test the newly created assembly with:
    Ildasm %WINDIR%\system32\ASD100Lib.dll
    The library can then be added to the C# project as a normal assembly. See the links below for details.
    Le sdk dotnet 1.1 microsoft est téléchargeable ici
    Normalement le SDK doit contenir les binaires tblimp et Ildasm

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/03/2015, 10h23
  2. Réponses: 7
    Dernier message: 10/03/2013, 15h49
  3. Réponses: 10
    Dernier message: 17/01/2011, 09h20
  4. [windows] charger une dll (avec classe)
    Par superpok dans le forum Windows
    Réponses: 11
    Dernier message: 09/09/2007, 11h15

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