2013-05-10 2 views
0

Я использую следующий код для доступа к методу в DLL-файле, и я получаю Access violation reading location 0x41100000 при вызове метода из метода dll.Доступ к точке доступа при доступе к методу dll

Метод, который я пытаюсь получить доступ имеет следующий прототип

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

Это мой код

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(); 
     } 
    } 
} 

Любые предложения, какие могут быть причины? Есть ли вероятность, что в файле dll есть ошибка? Есть ли способ читать параметры DLL-файла? Отнесите его, чтобы проверить, правильно ли я получаю параметры параметров? Средство проверки отсрочки показывает, что метод существует, но я не могу определить типы аргументов?

Update:

Я все еще получаю ошибку

первого шанса исключение в 0x0040356c в TEST.EXE: 0xC0000005: Нарушение прав доступа месте для записи 0x42080000. Необработанное исключение в 0x0040356c в Cexperiment.exe: 0xC0000005: Запись о нарушении доступа местоположение 0x42080000.

Я также считаю, что этот вопрос не может быть связано с призванием конвенции .The Поэтому я считаю, потому что я не получаю сообщение об ошибке от VS2010 о том, что соглашение о вызовах может быть cause.I получил это сообщение когда я попытался использовать другую DLL. Поэтому, если вызов конвенции или параметров не является проблемой (вы получаете одно и то же сообщение о вызове вызова, если параметры разные), то это может быть что-то другое. Какие-нибудь предложения по тому, что я мог попробовать?

+0

В вашем другом вопросе вы сказали, что требуется 9 поплавков. Здесь вы проезжаете 9 неплавающих. – huskerchad

+0

Да. Я думал, что это будет неявным. Я пробовал прохождение поплавков, и я получаю тот же ответ. – MistyD

+0

Не волнуйтесь, ints вместо поплавок в порядке. – chris

ответ

2

Вам необходимо проверить соглашение о вызове функции dll и соответственно указать тип LPMyfunct. Возможные значения для соглашений о звонках: stdcall, cdecl, pascal.

+0

'fastcall',' thiscall' :) – chris

+0

@igor вы предполагаете, что 'typedef int (* LPMyfunct) (float, float, float, float, float, float, float, float, float); 'возможно, может быть' typedef int (_stdcall * LPMyfunct) (float, float, float, float, float, float, float, float, float); или типы, которые вы упомянули? – MistyD

+0

@MistyD, Да, это зависит от того, что находится в DLL. – chris

Смежные вопросы