Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.25;
Скачать: CL | DM;

Вниз

Вызов функций 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
14-82975
The_Vizit0r!
2002-11-07 01:01
2002.11.25
Помогите найти компонент


3-82638
kate
2002-11-06 10:31
2002.11.25
Две БД Interbase в одном запросе


4-83043
_Vadim_
2002-10-13 18:37
2002.11.25
много Image -ов на форме


6-82895
TCrash
2002-09-27 13:07
2002.11.25
Socket к одному IP


14-82943
F1
2002-11-04 14:28
2002.11.25
Как вам такой вопросик???