2013-03-15 6 views
0

У меня есть файл example.cpp, который включает example.h в Windows. В файле example.h есть функция объявлена ​​какВызов внешней функции DLL изнутри функции класса

//example.h 
    _EXTERN S16BIT _DECL function(); 

Функция externed из DLL. В моем файле example.cpp У меня есть класс myclass, что я хочу, чтобы вызвать function() из функции-члена класса classfunc() так,

//example.cpp 
    class myclass{ 
    public: 
    classfunc(){ 
    function(); 
    } 

} 

Он компилирует хорошо, но когда он работает это дает мне исключение нарушения прав доступа. Я знаю, что это неправильно, но не знаю решения.

EDITED: _EXTERN определяется как пустой;

#define _EXTERN 

_DECL определяется как;

#define _DECL __stdcall 

S16BIT 2 байта

+0

Что делать '_EXTERN',' 'S16BIT' и _DECL' имею в виду? – SpongeBobFan

+0

В настоящее время невозможно сказать. Мы не знаем, к чему расширяются макросы. И у нас нет спецификации 'function'. –

+0

Вам нужно будет уточнить ... все. – mrh

ответ

0

Кажется, вы хотели бы, чтобы позвонить/потреблять чистую функцию C, функция(), из DLL. Пожалуйста, обратите внимание, что __stdcall является соглашение о вызовах для функций C++, вы должны иметь Используйте __cdecl

В вашем файле ч объявить функцию как этот

extern "C" __declspec(dllexport) signed short function(); 
+0

Это не полезно или точно. Языки не имеют соглашений о вызовах, и бессмысленно говорить, что stdcall - это соглашение на C++. И dllexport - это то, что вы делаете при реализации функции. –

+0

@DavidHeffernan вместо того, чтобы говорить _nonsense_, пожалуйста, попробуйте быть более конструктивным ... когда я говорю о соглашении на C++, я должен был сказать «как вызывается метод экземпляра C++» (я имел в виду здесь соглашение об этом в RCX/ECX и стеке режим очистки, который, разумеется, не имеет значения, если один из кодов на C). В случае, если «Бар» контролирует DLL, он/она может изменить свой прототип, поэтому я упомянул dllexport, а не dllimport. –

+0

С ++ методы могут быть вызваны с помощью любого соглашения о вызовах. И stdcall встречается очень редко. Обычно он используется для взаимодействия. Регистрация вызовов, fastcall, может использоваться на любом языке. stdcall не использует регистры, параметры идут в стек. Очистка стека абсолютно необходима для C. –