Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Вызов диалога CommConfigDialog или вызов функции из DLL  (Прочитано 16136 раз)
0 Пользователей и 1 Гость смотрят эту тему.
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« : 30-10-2006 14:02 » 

Всем привет!

Пишу на Visual Studio 2003, MFC 7.0

Реализация функции CommConfigDialog лежит в serialui.dll.
Подключить эту dll можно 2-мя способами, насколько я знаю (но у меня пока не один не работает Не понял).
Варианты: явное и неявное связывание.

Пытаюсь вызвать CommConfigDialog явным образом:
Код:
typedef BOOL (CommConfigDialogDLL)(LPTSTR lpszName, HWND hWnd, LPCOMMCONFIG lpCC);
...
            // Загружаем DLL
            COMMCONFIG commConfig;

            HINSTANCE hInstance = ::LoadLibrary("serialui.dll");
if (hInstance == NULL) {
MessageBox("Не могу загрузить библиотеку \"serialui.dll\". Проверьте ее наличие!", "Ошибка", MB_OK | MB_ICONERROR);
return;
}
CommConfigDialogDLL* pFunction = (CommConfigDialogDLL*) ::GetProcAddress((HMODULE) hInstance, "CommConfigDialog");
if (pFunction == NULL) {
if (GetLastError() == 0x0000007F)
MessageBox("Не найдена функция CommConfigDialog", "Ошибка", MB_OK | MB_ICONERROR);
else {
CString str;
str.Format("Код ошибки: %u", GetLastError());
MessageBox(str, "Ошибка", MB_OK | MB_ICONERROR);
}
return;
}

            memset(&commConfig, 0, sizeof COMMCONFIG);
            commConfig.dwSize = sizeof(commConfig);
             (*pFunction)(namePort, m_hWnd, &commConfig);

Система выдает ошибку: 0x0000007F, что соотв.-ет Не найдена указанная процедура.
Вопрос: Почему??? Что я делаю не правильно?

Пытаюсь вызвать CommConfigDialog неявным образом:

Пишу в свойствах проекта, т.е.: Project->Properties->Linker->Additional Dependencies="kernel32.lib winspool.lib". (без кавычек вообще то, просто здесь для "наглядности")
Код:
             char namePort[100];
// Получили имя используемого порта
strcpy(namePort,((CComPort*) m_smsSender.GetPort())->GetNamePort());

COMMCONFIG commConfig;
             memset(&commConfig, 0, sizeof COMMCONFIG);
             commConfig.dwSize = sizeof(commConfig);
CommConfigDialog(((CComPort*) m_smsSender.GetPort())->GetNamePort(), m_hWnd, &commConfig);

Ничего не происходит, причем в других проектах работает!? Здесь была моя ладья...

Подскажите пожалуйста, в чем дело, что не так, где я ошибаюсь.
Записан

С уважением, asker
Diletant
Помогающий

de
Offline Offline

« Ответ #1 : 02-11-2006 17:00 » 

Значит так. В этой Dll нет такой функции. Этой функции вообще в природе не существует. А существуют две других: CommConfigDialogA и CommConfigDialogW, и обе определены в kernel.dll. По меньшей мере так написано в MSDN, да и простой просмотр Dll это подтверждает.
Общее правило: если в определении функции в качестве параметров стоит нечто типа LPTSTR, TCHAR и т.д., то такой функции на самом деле не существует, а существуют два ее варианта для UNICODE и ANSI.
Записан
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 04-11-2006 08:42 » 

да и простой просмотр Dll это подтверждает.
А как просмотреть Dll?


А так спасибо большое. Про то, что чтобы воспользоваться CommConfigDialog надо использовать kernel32.lib - я не умею читать MSDN Скромно так..., а точнее я читал Агуров'а "Последовательные интерфейсы ПК", там написано, что эта функция определена в serialui.dll для порта, а для модема modem...dll .

И еще вопрос, а не будет конфликта, что я связываю Dll и явно и не явно?

Еще раз, спасибо.
« Последнее редактирование: 07-12-2007 19:52 от Алексей1153++ » Записан

С уважением, asker
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 04-11-2006 09:19 » 

Цитата
А как просмотреть Dll?
Программы DumpBin или Defender тебе помогут.
Цитата
И еще вопрос, а не будет конфликта, что я связываю Dll и явно и не явно?
Библиотека загружается в память только один раз, все остальные загрузки будут только увеличивать счетчик загрузок данной библиотеки.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 04-11-2006 14:06 » 

Понятно, спасибо.

Сейчас поищу про DumpBin и Defender.
Записан

С уважением, asker
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 04-11-2006 14:14 » 

Они входят в комплект поставки самой VC. В Билдере есть аналогичные программы. DumpBin консольная программа.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 05-11-2006 11:59 » 

А почему вызывать dumpbin можно только находясь в директории %SysRoot%\System32?
Иначе, она говорит, то fatal error, то не могу найти link.exe, то не могу найти mspdb71.dll.
Записан

С уважением, asker
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 05-11-2006 13:18 » 

Пропиши пути у себя. По идее говоря путь %SysRoot%\System32 должен быть прописан по умолчанию.
В консоле набери команду PATH и посмотри какие пути у тебя прописаны. Если нет нужных путей, то в регистре в переменных окружения допиши.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 05-11-2006 18:41 » 

Путь %SysRoot%\System32 у меня есть.

И извини за такой вопрос, но где в реестре переменные окружения записываются?
Я пробовал искать, path или конкретный адрес, но чето я не то помойму нашел, а т.к. с реестром
шутки плохи, я не стал пока ничего менять.
Записан

С уважением, asker
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 05-11-2006 19:04 » 

Вот выписка из книги Дж. Рихтера "Виндовс для профессионалов"
Цитата
WINDOWS 98
Чтобы создать исходный набор переменных окружения для Windows 98, надо модифицировать файл Autoexec.bat, поместив в него группу строк SET в виде
SET VarName=VarValue
При перезагрузке система учтет новое содержимое файла Autoexecbat, и тогда любые заданные Вами переменные окружения станут доступны всем процессам, инициируемым в сеансе работы с Windows 98

WINDOWS 2000
При регистрации пользователя на входе в Windows 2000 система создает npoцесс-оболочку, связывая с ним группу строк — переменных окружения. Система получает начальные значения этих строк, анализируя два раздела в реестре. В первом:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ SessionManager\Environment
содержится список переменных окружения, относящихся к системе, а во втором:
HKEY_CURRENT_USER\Environment
находится список переменных окружения, относящихся к пользователю, который в настоящее время зарегистрирован в системе.
Пользователь может добавлять, удалять или изменять любые переменные через апплет System из Control Panel B этом апплете надо открыть вкладку Advanced и щелкнуть кнопку Environment Variables — тогда на экране появится  диалоговое окно.

Модифицировать переменные из списка System Variables разрешается толь ко пользователю с правами администратора.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
asker
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 07-11-2006 03:35 » 

Понял, нашел,спасибо.
Записан

С уважением, asker
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines