Comment renvoyer la valeur de DLL en utilisant le paramètre de la fonction comme pointeur en C ++?

kov_george

J'ai une DLL simple:

dllmain.cpp:

#define MYDLLDIR        
#include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    ...
}


void callByPtr(int *i) {
    
    (*i)++;
}

pch.h

#include "framework.h"

#ifdef MYDLLDIR
#define DLLDIR __declspec(dllexport) __stdcall
#else
#define DLLDIR __declspec(dllimport)
#endif

extern "C" {

    DLLDIR void callByPtr(int *i);
        
};

Client:

typedef void(__stdcall* callByPtr)(int*);

int main()
{
    HINSTANCE hDLL;

    hDLL = LoadLibrary(_T("MyDll.dll"));

    if (NULL != hDLL)
    {

        callByPtr myCall = (callByPtr)GetProcAddress(hDLL, "callByPtr");

        if (!myCall) {
            return EXIT_FAILURE;
        }

        int i = 10;

        int* ptri = &i;

        std::cout << "i " << i << std::endl;
        std::cout << "ptri " << ptri << std::endl;

        myCall(ptri);

        std::cout << "---- After Call ----\n";

        std::cout << "i " << i << std::endl;
        std::cout << "ptri " << ptri << std::endl;    

    }
}

Résultat:

---- Avant l'appel ----

i = 10

ptri = 0025FB40

---- Après l'appel ----

i = 11286192

ptri = 0025FB3C

L'adresse de ptri a changé et la valeur n'était pas 11.

Comment implémenter cela correctement afin que je puisse obtenir une valeur de DLL en utilisant la méthode ci-dessus?

Je vous remercie!

StPiere

Vos définitions d'exportation ne sont pas non plus correctes. Devrait être quelque chose comme:

#ifdef MYDLL_EXPORT
#define MYDLLDIR  __declspec(dllexport)
#else
#define MYDLLDIR __declspec(dllimport)
#endif

et utilisez la même macro (MYDLLDIR) pour l'exportation (dll, #MYDLL_EXPORT défini) et l'importation (clients, #MYDLL_EXPORT NON défini)

Vous devez utiliser la même convention d'appel pour callByPtr à tous les endroits, dans votre cas __stdcall (la convention par défaut est __cstdcall).

Dans votre pch.h alors:

MYDLLDIR void __stdcall callByPtr(int *i);

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Comment obtenir la valeur de retour d'une fonction en utilisant le contexte comme paramètre?

Comment puis-je obtenir la deuxième valeur de la fonction en utilisant le pointeur *?

c comment évaluer le pointeur de fonction en utilisant le nom de la fonction

En C, pourquoi puis-je passer le nom de la fonction (pas un pointeur) comme paramètre à funtion?

Comment renvoyer le pointeur de retour de la fonction dll C ++ vers C #

Comment passer le pointeur de fonction à la fonction en c?

Utiliser la valeur #define comme paramètre de fonction en C - pourquoi ça marche?

Comment utiliser le pointeur vers la fonction d'ami en tant que paramètre de la fonction membre

Javascript: comment passer la valeur en paramètre de fonction?

Comment utiliser la DLL de la fonction de pointeur c byte en c #?

Comment renvoyer la valeur de la fonction debounce en javascript?

comment appeler la fonction appropriée en utilisant le nom de la fonction et les paramètres comme variables? PHP

Comment renvoyer la valeur de JavaScript en utilisant Selenium?

Retourne le pointeur de la fonction avec le pointeur comme paramètre

Comment passer la valeur au paramètre de pointeur C ++

Comment renvoyer la valeur de Dispatcher.Invoke, qui utilise la fonction déléguée comme paramètre

Que fait le "pointeur vers la variable de registre" en tant que paramètre de fonction?

Calculer la somme de deux nombres et la "retourner" en utilisant une fonction void en C avec un pointeur en paramètre

Comment renvoyer la valeur de exec en fonction?

Comment puis-je taper un pointeur de fonction avec le C ++ 11 en utilisant la syntaxe?

comment peut renvoyer la valeur au composant en utilisant l'abonnement dans le fichier de service ?

Comment trier la carte en fonction de la valeur en C ++ en utilisant stl?

Supprimer l'objet de arrayList en utilisant la valeur du champ d'objet comme paramètre

Renvoyer un pointeur void en tant que paramètre de fonction en C

lapply en utilisant l'itérateur comme paramètre de la fonction

Comment récupérer le pointeur de fonction de la fonction interne en C?

comment retourner le pointeur de fonction de la fonction composée en c++?

Créer un nouveau tibble en utilisant la valeur de ligne précédente d'une colonne comme paramètre de la valeur de ligne actuelle

Passer lambda en tant que paramètre de modèle à un modèle par la fonction de pointeur de fonction

TOP liste

  1. 1

    comment afficher un bouton au-dessus d'un autre élément ?

  2. 2

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  3. 3

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

  4. 4

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  5. 5

    Conversion double en BigDecimal en Java

  6. 6

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  7. 7

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  8. 8

    Passer la taille d'un tableau 2D à une fonction ?

  9. 9

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  10. 10

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  11. 11

    CSS: before ne fonctionne pas sur certains éléments,: after fonctionne très bien

  12. 12

    Comment créer un bot à compte à rebours dans Discord en utilisant Python

  13. 13

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  14. 14

    Exporter la table de l'arborescence vers CSV avec mise en forme

  15. 15

    Comment activer le message Pylint "too-many-locals" dans VS Code?

  16. 16

    Créer un système Buzzer à l'aide de python

  17. 17

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  18. 18

    Empêcher l'allocation de mémoire dans la génération de combinaison récursive

  19. 19

    Déplacement des moindres carrés d'ajustement pour les déplacements de points ayant des problèmes

  20. 20

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  21. 21

    Microsoft.WebApplication.targets

chaudétiquette

Archive