Имеется 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# работает же!!
Этот самый код без студии — работает, под студией — нет.
Я уже пробовал даже чистый IDispatch::Invoke
Пробовал выделять память под VARIANT_BOOL через CoTaskMemAlloc
Пробовал разные варианты CoInitializeEx(NULL, ...)
al>А если убрать в #import флаги no_implementation, raw_interfaces_only и попробовать использовать те обертки, что VC нагенерирует?
Пробовал во всех возможных комбинациях
al>Может быть, в DLL заложена защита от отладки? Попробуйте в C# включить режим "нативного" отладчика, и посмотреть, будет ли он работать.
Хм. Да, включил "Enable unmanaged code debugging" — тоже стало вылетать.
Надо почитать, что при этом происходит...
Но если бы там была защита — то вообще не работало бы, наверное.
А так, во-первых, часть методов работает.
А во-вторых, даже в тех методах, что выдают ошибку — ошибка вылетает уже после того, как метод отработал как надо — такое впечатление, что просто при попытке передать результат обратно.