Экстерьер указывает на 0x00000000 - PullRequest
0 голосов
/ 11 января 2011

Я использую Microsoft Visual C ++ 2010 Express в Windows XP.

У меня есть одно приложение, которое создает DLL, заголовочный файл в этом приложении также объявляет указатель на BUFFER как extern.Чтобы зарегистрировать эту DLL в системе, я перетащил ее на значок regsvr32.exe в папке system32.

У меня есть другое приложение, которое проверяет использование этой DLL, инициализируя и вызывая из нее функции.Это приложение получает доступ к тому же буферу, что и DLL, используя это объявление extern.

Сначала, когда я использовал отладчик Visual Studio для отладки тестового приложения, я мог видеть содержимое внешнего буфера из загруженной DLL.Однако после неоднократной отладки этого приложения теперь BUFFER не отображает адрес своей памяти, просто «0x0000000», поэтому я не могу просмотреть данные.

Кто-нибудь знает, почему это может быть?Я не могу понять, почему это раньше работало, но сейчас нет.Я вообще не изменил ни одного аспекта этой части исходного кода.Можно ли получить доступ к буферу в DLL с помощью внешнего указателя, подобного этому, или есть лучший способ?

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 11 января 2011

В C ++ extern означает, что эта переменная объявлена ​​в другом * .cpp (единица перевода). Пример: myfile1.cpp:

int globalVariable = 0;

myfile2.cpp:

extern int globalVariable; //same variable, because of extern

Если вам нужно экспортировать из dll, вы должны использовать dllexport (в библиотеке) и dllimport (в потребителе библиотеки) для функций и переменных, например: mylibrary.cpp:

__declspec(dllexport) int myGlobalExportingVariable = 0;

myprogram.cpp:

__declspec(dllimport) int myGlobalExportingVariable;

Конечно, в реальном мире вы, вероятно, использовали бы что-то вроде этого: mylibrary.hpp:

#ifdef MYLIBRARY
#define MYLIBRARY_ITEM __declspec(dllexport)
#else
#define MYLIBRARY_ITEM __declspec(dllimport)
#endif

MYLIBRARY_ITEM void func1();
MYLIBRARY_ITEM int variable0;
MYLIBRARY_ITEM float func2();
//...

И вы # включаете этот заголовок в mylibrary.cpp и myprogram.cpp; не забудьте определить макрос MYLIBRARY в настройках вашего проекта (C ++ -> Preprocessor -> Preprocessor определений).

Кстати: как указано в комментарии PiotrLegnica, регистрация вашей библиотеки dll с помощью regsvr32.exe не имеет смысла, если вы не используете технологию COM (объектная модель компонентов).

0 голосов
/ 11 января 2011

Когда вы объявляете переменную с помощью extern, это значит только объявить ее, но не определить ее (без выделения памяти для этой переменной), потому что она определяет ее в другом месте. Вы объявляете переменную в вашем файле cpp с dll-кодами. В заголовке сделайте это как extern с помощью dllexport / import и теперь используйте его.

...