Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов функций DLL из компонента. [D5, NT4, Win2k, WinXP]


EvgenyDr ©   (2002-11-12 23:10:00) 

Уважаемые коллеги.
У меня есть полностью отлаженная DLL.
Когда я вызываю её функции из обычного приложения то всё работает отлично.
Но когда я использую её в составе компонента: в конструкторе загружаю Dll, динамически гружу функции все нормально, однако все функции просто НЕ РАБОТАЮТ.
Кто-нибудь может подсказать в чем здесь дело или в каком направлении копать?
Спасибо.


apay   (2002-11-14 00:44:00) [1]

TCHAR как интерпретируется в данном случае? как char или как widechar. может здесь и "порылась собака" :)


EvgenyDr   (2002-11-14 00:30:00) [2]

Абсолютно одинаковый вызов, просто копировал.
Сервис-то в обоих случаях успешно создается, но не запускается из конструктора (и используется-то уже хэндл созданного сервиса).


Юрий Зотов   (2002-11-14 00:03:00) [3]

А вызов-то? Ведь сама функция, видимо, работает (раз работала), а все дело в вызове и в параметрах. Кстати, отладчиком параметры трассировали, верно ли они передаются?


EvgenyDr   (2002-11-13 23:47:00) [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-13 23:26:00) [5]

Насколько я понял, оба этих вызова находятся внутри одной функции DLL, которая и вызывается из приложения. Тогда, похоже, что-то не так с передачей ее параметров. Но что можно сказать, не видя ни объявления этой функции, ни ее фактического вызова? Ничего, кроме того, что если все правильно, то и вызов из конструктора тоже должен работать.

Еще - видимо, все же nil, а не NULL.


EvgenyDr   (2002-11-13 21:28:00) [6]

Внутри компонента никаких ошибок не возникает.
Исследование кода внутри DLL показало, что перестает работать связка:
service:=CreateService(...)
StartService(Service,0,NULL)

CreateService отрабатывает нормально, а вот StartService при вызове функции из приложения отрабатывает нормально, а при вызове из компонента дает ошибку. GetLastError в этом случае "не удается найти указанный файл"


Юрий Зотов   (2002-11-13 00:34:00) [7]

И снова любимая игра в угадайку...
Что ж, будем угадывать... раз код такой секретный...

Начнем с классики - что дает GetLastError?


Наверх

Титульная страница Поиск, карта сайта Написать письмо