Частные функции DLL общедоступны - PullRequest
0 голосов
/ 01 ноября 2010

Я сгенерировал библиотеку Win32 DLL с использованием C ++ в Visual Studio 2008. Все мои функции определены в единственном классе, встроенном в новую DLL. Некоторые функции объявлены как private, а другие - public. Я использую Dependency Walker для объективной проверки доступности функций в моей DLL. Мой класс объявлен как __declspec(dllexport) MyClass { /* ... */ };. Означает ли это, что все функции класса будут общедоступными, независимо от их разрешений?

Возможно, есть опция компиляции / проекта, которую мне нужно установить, чтобы принудительно установить разрешения конфиденциальности в скомпилированной DLL?

Ответы [ 3 ]

4 голосов
/ 01 ноября 2010

Да, компилятор зависит от целостности файла .h с определением класса, чтобы обеспечить конфиденциальность членов класса.Если кто-то изменит определение класса, загрузчик будет очень рад связать эти частные функции.

2 голосов
/ 01 ноября 2010

Спецификаторы доступа - это чистая функция компилятора front-end .Они не будут отображаться в сгенерированном коде.

Чтобы использовать ваш класс в своем коде, пользователям необходимо определение класса, обычно предоставляемое в форме одного или нескольких .h файлов.Здесь есть спецификаторы доступа, что запрещает пользователям класса получать доступ к закрытым частям - , если они не изменяют заголовок .

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

0 голосов
/ 01 ноября 2010

Нет - только открытые члены класса, экспортированные с использованием __declspec(dllexport), будут видны снаружи.

http://msdn.microsoft.com/en-us/library/a90k134d.aspx

Чтобы экспортировать все публичные данные члены и функции-члены в класс, ключевое слово должно появляться в осталось от имени класса следующим образом:

class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };
...