VB dll-ка глючит в дебаге под VC++
От: allex_z  
Дата: 23.11.07 20:52
Оценка:
Имеется dll написанная на VB6. В ней некий объект с методами. Сорцов к сожалению нет.
Когда я эту dll цепляю в VB или VC# любых версий, создаю объект, вызываю методы — всё работает змечательно.
Когда я это делаю в VC++ (опять же версий от 6 до 2005) и запускаю в дебаге, то на некоторые методы эта dll у себя внутри выдает ошибку "Invalid access to memory location".
Когда же этот самый код билдишь и потом пускаешь без студии — то всё работает замечательно.
Как только приаттачишь к уже запущеному процессу студию — снова работать перестает!
Причем такая особенность: есть методы, которые возвращают BSTR (и соответственно внутрь передается BSTR*) — они отрабатывают нормально, а которые возвращают VARIANT_BOOL — те валятся.
Я уже голову сломал, из-за чего такое может быть... Студия что-то портит?
Все варианты threading model перебрал, всеми способам пробовал выделять память под этот in/out VARIANT_BOOL параметр — не помогает.
Наверняка внутри этой dll что-то напортачили, но из-под VB и VC# работает же!!
Re: VB dll-ка глючит в дебаге под VC++
От: al Россия  
Дата: 24.11.07 09:10
Оценка:
Здравствуйте, allex_z, Вы писали:

На пример кода на C++ посмотреть можно?


Re[2]: VB dll-ка глючит в дебаге под VC++
От: allex_z  
Дата: 24.11.07 09:24
Оценка:
al>На пример кода на C++ посмотреть можно?

Простейший вариант:

#import "some.dll" no_namespace, named_guids, no_implementation, raw_interfaces_only
...

HRESULT hr = CoInitialize(NULL);

_MessagingPtr p;
hr = p.CreateInstance(CLSID_Messaging, NULL, CLSCTX_INPROC_SERVER);

if (SUCCEEDED(hr))
{
    VARIANT_BOOL b;
    hr = p->VerifyEmailAddress(_bstr_t("test@test.com"), (VARIANT_BOOL*) &b);
}


VerifyEmailAddress определена как:

virtual HRESULT __stdcall VerifyEmailAddress (
 /*[in]*/ BSTR vEmail,
 /*[out,retval]*/ VARIANT_BOOL * _arg2 ) = 0;


Этот самый код без студии — работает, под студией — нет.

Я уже пробовал даже чистый IDispatch::Invoke
Пробовал выделять память под VARIANT_BOOL через CoTaskMemAlloc
Пробовал разные варианты CoInitializeEx(NULL, ...)
Re[3]: VB dll-ка глючит в дебаге под VC++
От: al Россия  
Дата: 24.11.07 12:15
Оценка:
Здравствуйте, allex_z, Вы писали:

А если убрать в #import флаги no_implementation, raw_interfaces_only и попробовать использовать те обертки, что VC нагенерирует?


Re[3]: VB dll-ка глючит в дебаге под VC++
От: al Россия  
Дата: 24.11.07 12:18
Оценка:
Здравствуйте, allex_z, Вы писали:

Может быть, в DLL заложена защита от отладки? Попробуйте в C# включить режим "нативного" отладчика, и посмотреть, будет ли он работать.


Re[4]: VB dll-ка глючит в дебаге под VC++
От: allex_z  
Дата: 25.11.07 09:51
Оценка:
al>А если убрать в #import флаги no_implementation, raw_interfaces_only и попробовать использовать те обертки, что VC нагенерирует?

Пробовал во всех возможных комбинациях

al>Может быть, в DLL заложена защита от отладки? Попробуйте в C# включить режим "нативного" отладчика, и посмотреть, будет ли он работать.


Хм. Да, включил "Enable unmanaged code debugging" — тоже стало вылетать.
Надо почитать, что при этом происходит...

Но если бы там была защита — то вообще не работало бы, наверное.
А так, во-первых, часть методов работает.
А во-вторых, даже в тех методах, что выдают ошибку — ошибка вылетает уже после того, как метод отработал как надо — такое впечатление, что просто при попытке передать результат обратно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.