2014-11-17 3 views
2

Я не программировал какие-либо окна в течение нескольких лет, и я немного ржавчу, как использовать dllimport. У меня есть кое-что вдоль линий:Использование dllimport с Visual C++

extern "C" 
{ 
__declspec(dllimport) int myFunct(); 
} 

int main() 
{ 
    cout<<myFunct(); 
} 

Я получаю 2 неразрешенных внешних ошибки компоновщика и предупреждение, что /DELAYLOAD:myLib.dll было проигнорировано, так как не было обнаружено импорт из него. Что мне здесь не хватает? Я думал, что я могу добавить DLL к пути загрузки задержки, и компоновщик будет использовать его для импорта dll?

Это сторонняя DLL-версия, которая поставляется без файлов .h или .lib.

ответ

1

Если вы хотите связать DLL во время выполнения, вам совсем не нужно импортировать символы.

Просто объявите тип указателя функции, затем LoadLibrary()/LoadLibraryEx() и, наконец, получите указатель функции от GetProcAddress().

Пример (обработка ошибок пропущена для краткости):

typedef int (*MyFunct_t)(); 
auto myDLL = LoadLibrary("mydll.dll"); 
auto MyFunct = (MyFunct_t)GetProcAddress(myDLL, "MyFunct"); 
MyFunct(); 

(этот код только, чтобы показать общую процедуру, он никогда не был составлен и проверена и может содержать опечатки и ошибку синтаксиса, не стесняйтесь редактировать этот пост, чтобы исправить их)

+0

Я закончил тем, что не пытался определить параметры компилятора/компоновщика. – ventsyv

0

Вы можете использовать, DllImport как это,

extern "C" 
{ 
__declspec(dllimport) int myFunct(); 
} 

Просто помните myFunct должен быть dllexport, где вы определили его.

1

Я сделал это так:

1) Добавлен файл MyLibDll.h проекта

#pragma once 

#if MYLIB_EXPORTS 
#define MYLIB_API __declspec(dllexport) 
#else 
#define MYLIB_API __declspec(dllimport) 
#endif 

2) Используйте это в библиотечных заголовочных файлах

#include "MyLibDll.h" 

    class MYLIB_API myClass 
{ 

} 

Это может быть используется с методами to.

3) Добавлена ​​опция компилятора /D MYLIB_EXPORTS в .dll-проекте.

Не уверен, что это лучшее решение, но оно сработало для меня.

+0

Это сторонняя DLL, которая не имеет файлов .h или .lib. – ventsyv

+0

@ventsyv Какой IDE/компилятор вы используете? AFAIK, вам нужен хотя бы файл .lib для использования extern .dll в Visual Studio. Кроме того, мой ответ совершенно бессмыслен в этом случае. –

+0

VisualStudio 2012. Мне не нужен .lib, я сделал это раньше, но не могу вспомнить параметры компоновщика. – ventsyv

1

__declspec(dllimport) сообщает компилятору, что символ импортирован, но он не сообщает, откуда. Чтобы указать это, вам нужно связать с библиотекой импорта, которая сопровождает DLL. Если у вас его нет, вы можете создать компоновщик для него by providing a definition file.

+0

Я думал, что могу сказать компилятору, чтобы отложить его загрузку во время выполнения? Я могу сделать это программно, вызвав LoadLibrary, но я подумал, что есть способ заставить компилятор выполнить эту работу для меня? – ventsyv

+0

@ventsyv, '/ DELAYLOAD' является вариантом компоновщика, а не компилятора. Не существует конфликта между использованием .def-файла и указанием '/ DELAYLOAD'. – ach

0

Я получаю 2 неразрешенных внешних ошибки компоновщика и предупреждение о том, /DELAYLOAD:myLib.dll ...

Это третья сторона DLL, которая поставляется без .h или .lib файл.

Попробуйте добавить следующие строки в исходном файле:

#pragma comment(lib, "myLib") 
extern int myFunct(); 

В pragma comment помещает запись для библиотеки в файле объекта. Вторая предоставляет декларацию для функции.

Из ваших комментариев вы могли бы также говорить о /INCLUDE (Force Symbol References). Вы можете разместить это в исходном файле с pragma comment.

При необходимости вы можете создать папку импорта. См. How To Create Import Libraries Without .OBJs or Source и How to generate an import library (LIB-file) from a DLL?.

Или, используйте LoadLibrary и GetrocAddress.

+0

Прагма, которую вы предлагаете, служит совсем другой цели: она поручает компоновщику добавить указанную статическую библиотеку в ссылку. Он может быть использован для удобной связи с библиотекой импорта DLL, не требуя указания ее в командной строке компоновщика - если бы у OP был один. – ach

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