-
Здравствуйте, мастера.
Подскажите, что я делаю не так:
Есть некая DLL с именем mqic32.dll, лежит в 'd:\IBM\WebSphere MQ\bin\' (путь этот в системной PATH присутствует)
обявляю
procedure MQDISC(......);cdecl;external 'mqic32.dll';
потом использую
MQDISC(......);
При запуске скомпиленного EXE-шника ошибок не выдает.
Если же пытаюсь из-под среды запустить, то получаю ошибку 0xc0000008.
А мне надо проект подебажить.
Кто-нить знает, как это вылечить?
-
> procedure MQDISC(......);cdecl;external 'mqic32.dll';
cdecl точно ? А с указателями которые в DLL нормально всё ?
-
> cdecl точно ? А с указателями которые в DLL нормально всё ?
Без cdecl то же самое (ошибки остаются), но при вызове MQDISC ловим еще и "акцес_виалейшн".
Это попытка "дернуть" API от IBM WebSphere MQ - там с указатели нормальные, ибо поставляемые с пакетом приблуды работают без ошибок.
Интересно вот что - если делать так:
// procedure MQDISC(......);cdecl;external 'mqic32.dll';
...
Handle := LoadLibrary('mqic32.DLL');
...
// MQDISC(......);
то Handle равен 0!
Если объявление и вызов MQDISC раскомментить, то Handle <> 0, но ошибки остаются!
-
> Без cdecl то же самое
Ты что же, соглашение о вызове от балды указал ?)
> Handle равен 0
Вызови GetLastError и узнай почему.
-
> Ты что же, соглашение о вызове от балды указал ?)
Нет.
Уточняю: IBM офицально не декларирует в MQ работу с Delphi. На их родном сайте был найдет модуль-обертка для вызова MQ API (автора не помню, но это не сами АйБиЭмеры). Строка
procedure MQDISC(......);cdecl;external 'mqic32.dll';
из этого модуля.
Где-то полгода назад был писан софт - тогда все нормально дебажилось.
Недавно встал вопрос о "докрутить" - получаю вышеописанные грабли.
Или у меня MQ/Дельфи/Систему за это время переклинило или я че-то не понимаю.
-
Не факт, что тут ошибка. Перезаписать память можно где угодно, а AV схватить тут.
-
Может быть в новой версии dll добавился параметр?
8 - это случайно не значение какой-нибудь локальной переменной? Зайдите внутрь функции в окне CPU и выясните, как обрабатываются параметры и правильно ли. Надо надеяться, это происходит в начале работы функции.
-
Может я че-то не догоняю...
Ошибка валиться в среде ДО ПЕРВОГО ШАГА, т.е. нажимаю Ф8, получаю ошибку (!) и только потом попадаю на самый первый begin. Непосредственный вызов функции происходит шагов через 10.
При чем тут параметры?
-
> 8 - это случайно не значение какой-нибудь локальной переменной?
0xc0000008 - OS Exceptions - Invalid handle
телепатирую - смотрите инициализацию локальных переменных...
-
> Handle := LoadLibrary('mqic32.DLL');
> Handle равен 0
>
> Ошибка валиться в среде ДО ПЕРВОГО ШАГА
- угу, а путь указать не судьба? Или для начала убедиться что он пристуствует в переменной PATH среды окружения?
Оттуда и Invalid handle.
-
2han_malign:
> - угу, а путь указать не судьба? Или для начала убедиться
> что он пристуствует в переменной PATH среды окружения?Оттуда
> и Invalid handle.
> Есть некая DLL с именем mqic32.dll, лежит в 'd:\IBM\WebSphere
> MQ\bin\' (путь этот в системной PATH присутствует)
Вниметельнее читайте, сударь, а уж потом под****те!
зы. Вопрос снимается - я не знал, что добрый админ накатил апдейт на MQ, а мне ничего не сказал про это. Снес все нах и переставил без апдейта - все встало на свои места.
Всем спасибо.