Форум: "Основная";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
ВнизВызов функций DLL из компонента. Найти похожие ветки
← →
EvgenyDr (2002-11-12 23:10) [0]Уважаемые коллеги.
У меня есть полностью отлаженная DLL.
Когда я вызываю её функции из обычного приложения то всё работает отлично.
Но когда я использую её в составе компонента: в конструкторе загружаю Dll, динамически гружу функции все нормально, однако все функции просто НЕ РАБОТАЮТ.
Кто-нибудь может подсказать в чем здесь дело или в каком направлении копать?
Спасибо.
← →
Юрий Зотов (2002-11-13 00:34) [1]И снова любимая игра в угадайку...
Что ж, будем угадывать... раз код такой секретный...
Начнем с классики - что дает GetLastError?
← →
EvgenyDr (2002-11-13 21:28) [2]Внутри компонента никаких ошибок не возникает.
Исследование кода внутри DLL показало, что перестает работать связка:
service:=CreateService(...)
StartService(Service,0,NULL)
CreateService отрабатывает нормально, а вот StartService при вызове функции из приложения отрабатывает нормально, а при вызове из компонента дает ошибку. GetLastError в этом случае "не удается найти указанный файл"
← →
Юрий Зотов (2002-11-13 23:26) [3]Насколько я понял, оба этих вызова находятся внутри одной функции DLL, которая и вызывается из приложения. Тогда, похоже, что-то не так с передачей ее параметров. Но что можно сказать, не видя ни объявления этой функции, ни ее фактического вызова? Ничего, кроме того, что если все правильно, то и вызов из конструктора тоже должен работать.
Еще - видимо, все же nil, а не NULL.
← →
EvgenyDr (2002-11-13 23:47) [4]Вот эта функция (написана на VС++, но думаю все понятно)
BOOL LoadDeviceDriver( const TCHAR * Name, const TCHAR * Path )
{
SC_HANDLE schSCManager;
SC_HANDLE schService;
BOOL okay;
LPVOID lpMsgBuf;
schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
schService = CreateService( SchSCManager,
Name,
Name,
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
Path,
NULL,
NULL,
NULL,
NULL,
NULL
);
if ( schService == NULL )
return FALSE;
okay = StartService( schService, 0, NULL );
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0,
NULL
);
MessageBox( NULL, (LPCTSTR)lpMsgBuf, "FAIL", MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
CloseServiceHandle( schService );
CloseServiceHandle( schSCManager );
return okay;
}
Так вот из приложения все нормально, а из конструктора StartService дает вышеописанную ошибку. Сама DLL в WINDOWS\SYSTEM32 (WinXP)
← →
Юрий Зотов (2002-11-14 00:03) [5]А вызов-то? Ведь сама функция, видимо, работает (раз работала), а все дело в вызове и в параметрах. Кстати, отладчиком параметры трассировали, верно ли они передаются?
← →
EvgenyDr (2002-11-14 00:30) [6]Абсолютно одинаковый вызов, просто копировал.
Сервис-то в обоих случаях успешно создается, но не запускается из конструктора (и используется-то уже хэндл созданного сервиса).
← →
apay (2002-11-14 00:44) [7]TCHAR как интерпретируется в данном случае? как char или как widechar. может здесь и "порылась собака" :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c