2013-05-10 2 views
0

J'utilise le code suivant pour accéder à une méthode dans le fichier dll et j'obtiens un Access violation reading location 0x41100000 lorsque j'appelle la méthode de la méthode dll.Accédez à l'emplacement de lecture de violation lors de l'accès à une méthode dll

La méthode que je suis en train d'accéder est du prototype suivant

int dstoch(float,float,float,float,float,float,float,float,float); 

Ceci est mon code

typedef int (*LPMyfunct)(float,float,float,float,float,float,float,float,float); 
HINSTANCE hDLL = NULL; 
LPMyfunct lpdstoch = NULL; 

hDLL = LoadLibrary("c:\\myfile.dll"); 

if(hDLL!=NULL) 
{ 
    std::cout << "Library loaded \n"; 
    lpdstoch = (LPMyfunct)GetProcAddress((HMODULE)hDLL, "dstoch"); 

    int res = 0; 
    if(lpdstoch != NULL) 
    { 
     try 
     { 
      res = lpdstoch(1.1,2.2,3.3,4.4,5.4,6.4,7.4,8.8,9.9); //Gives the error 
     } 
     catch (std::exception &e) 
     { 
      std::cout << e.what(); 
     } 
    } 
} 

Toute suggestion que les raisons pourraient être? Y a-t-il une erreur dans le fichier dll? Y at-il un moyen de lire les paramètres du fichier dll? Le détecter pour vérifier si les types de paramètres sont corrects? Le vérificateur de la dépendance montre que la méthode existe mais je ne peux pas identifier les types d'arguments?

Mise à jour:

Je reçois toujours l'erreur

exception de première chance à 0x0040356c en test.exe: 0xC0000005: violation d'accès emplacement d'écriture 0x42080000. Exception non gérée au 0x0040356c dans Cexperiment.exe: 0xC0000005: violation d'accès écriture emplacement 0x42080000.

Je crois aussi que cette question pourrait ne pas être lié à une convention d'appel .La raison pour laquelle je crois parce que je ne reçois pas un message d'erreur de VS2010 indiquant qu'une convention d'appel peut être un cause.I a ce message quand j'ai essayé d'utiliser une autre DLL. Donc, si l'appel d'une convention ou de paramètres n'est pas un problème (vous obtenez le même message de convention d'appel dans le cas où les paramètres sont différents) alors cela pourrait être quelque chose d'autre. Des suggestions sur ce que je pourrais essayer?

+0

Dans votre autre question, vous avez dit qu'il faut 9 flotteurs. Ici vous passez 9 non flottants. – huskerchad

+0

Oui. Je pensais que la conversion serait implicite. J'ai essayé de passer des flotteurs et je reçois la même réponse – MistyD

+0

Ne vous inquiétez pas, les ints à la place des flotteurs est très bien. – chris

Répondre

2

Vous devez vérifier la convention d'appel de la fonction dll et déclarer le type LPMyfunct en conséquence. Les valeurs possibles pour les conventions d'appel sont: stdcall, cdecl, pascal.

+0

'fastcall',' thiscall' :) – chris

+0

@igor suggérez-vous que 'typedef int (* LPMyfunct) (float, float, float, float, float, float, float, float, float); 'pourrait éventuellement être' typedef int (_stdcall * LPMyfunct) (float, float, float, float, float, float, float, float, float); 'ou des types que vous avez mentionnés? – MistyD

+0

@MistyD, Oui, cela dépend de ce qu'il est dans la DLL. – chris

Questions connexes