Экспорт функции из dll
, не получается экспортировать фцию, возвращающую указатель.
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.116] |
|
|
Экспорт функции из dll
, не получается экспортировать фцию, возвращающую указатель.
|
Сообщ.
#1
,
|
|
|
|
Мне нужно создать dll и в ней одну функцию экспортировать. не получается.. и не пойму в чем дело.
Приведу простейший пример: ![]() ![]() //h-файл int* __declspec(dllexport) function(); //cpp-файл int* function() { static int var=5; return &var; } На этот код компилятор ругается "error C2059: syntax error : '__declspec(dllexport)'" Почему? ЗЫ: на всякий случай - в реале, конечно, используется не эта функция, а посложнее: ![]() ![]() extern "C" IUnknown* __declspec(dllexport) CreateInstance() { IUnknown* pI = static_cast<IX*>(new CA) ; pI->AddRef() ; return pI ; } В двух словах - надо в DLL расположить COM-компонент и через эту экспортируемую функцию вернуть указатель на стандарный интерфейс, чтобы в дальнейшем с ним работать.. впрочем сути это не меняет и компилятор выдает ту-же ошибку, ругаясь на возвращаемый указатель. |
|
Сообщ.
#2
,
|
|
|
|
Перенеси __declspec в начало декларации функции.
Добавлено И добавь void в список параметров. Иначе внезапно получишь декларацию переменной. |
|
Сообщ.
#3
,
|
|
|
|
Большое спасибо! В варианте
![]() ![]() //h-файл extern "C" __declspec(dllexport) IUnknown* CreateInstance(void); все заработало.. Можно еще небольшой вопрос, который меня смущает? В h-файле у меня у меня лежит полное объяление фции - т.е. и с extern "C", и с __declspec(dllexport). А в cpp-файле определить функцию можно двумя способами: ![]() ![]() extern "C" __declspec(dllexport) IUnknown* CreateInstance(void){/* код фции */}; //так IUnknown* CreateInstance(void){/* код фции */}; //или так.. В общем-то, как я понял, компилятор считает оба определения корректными и принимет за одну функцию.. но какой вариант написания будет более правильным? |
|
Сообщ.
#4
,
|
|
|
|
Оба, наверное.
В единице трансляции не может быть двух разных функций, с одинаковыми именем и параметрами, поэтому второе определение автоматически дополняется компилятором до первого. А вот удобнее будет первый заголовок - меньше недоразумений, не примешь функцию за нормальную. Кстати, уверен, что компилятор в этом месте даже предупреждения не выдает? |
|
Сообщ.
#5
,
|
|
|
|
Спасибо
. Не выдает: warning-ов - ноль. |
|
Сообщ.
#6
,
|
|
|
|
Может у тебя эти варнинги просто не включены?
|