Программирование на Visual C++. Архив рассылки | страница 36



ОЧЕНЬ СИЛЬНО портит впечатление обилие опечаток и орфографических ошибок (не говоря уже о пунктуационных) … во многих  из "шагов" я мог насчитать не меньше двух. Обидно! В крайнем случае – вроде спел-чекеры уже не редкость… 

Не знаю, как сейчас, но раньше, помню, сайт не позволял себя скачивать целиком программами типа Teleport Pro. Мне это казалось совершенно неоправданным и ненужным ограничением – в конце концов, у нас ведь не Америка, где неограниченный доступ стоит 15-20 долларов в месяц. В гостевой книге 90% записей были посвящены этому вопиющему безобразию… Авторам сайта, наверно, это надоело, и они гостевую книгу убрали совсем… ;)

Хотя выполнять свое предназначение сайту все это, конечно, не мешает. Да и критиковать легко…

Зайдите, посмотрите, –  скорее всего, найдете что-нибудь интересное и для себя.

ВОПРОС-ОТВЕТ

Q. Как получить доступ к ресурсам DLL в самой DLL? Задача сводилась к следующему – нужно было сделать диалоговое окно в функции, которая находилась в DLL

>declspec(dllexport)

>int MyDllFunction() {

> CDialog dlg;

> int ret = dlg.DoModal();

> return ret;

>}

DLL имела ресурс Dialog для этого диалогового окна, но работать напрочь отказывалась – этот ресурс не обнаруживался и окно не создавалось. DLL собиралась как со статически линкуемой библиотекой MFC, так и с динамически линкуемой библиотекой MFC.

Igor Sorokin

A1. В вопросе приводился пример функции, с помощью которого предполагалось вызвать диалог. В MSDN я нашёл статью TN058, рассказывающую о том, как реализовано управление модулями в MFC.

Для того, чтобы получить доступ к любому объекту MFC из экспортируемой функции, необходимо в самом начале функции поставить AFX_MANAGE_STATE(AfxGetStaticModuleState()) ;

Таким образом, будут корректно реализована связь дескрипторов (HANDLE) с объектами MFC и , в частности, ресурсы, хранимые в DLL будут корректно задействованы:

>declspec(dllexport)

>int MyDllFunction() {

> AFX_MANAGE_STATE(AfxGetStaticModuleState());

> CDialog dlg(IDD_TESTDLG);

> return dlg.DoModal();

>}

Алексей Селезнев

A2. Вообще говоря, доступ к ресурсам DLL из самой DLL получать не надо – он и  так дан. Но пример, указанный в вопросе, по-моему, чуть-чуть не правильный, и работать никогда не будет, потому как "CDialog dlg" не проинициализирован как следует. Пусть в DLL-проекте создан ресурс-диалог, с идентификатором (например) IDD_RTNDIALOG. Для того, показать этот ресурс-диалог (в модальном режиме), надо выполнить:

>CDialog dlg(IDD_RTNDIALOG);