Форум: "Основная";
Текущий архив: 2003.03.24;
Скачать: [xml.tar.bz2];
ВнизТрабл при попытке использования собранного Найти похожие ветки
← →
PVOzerski (2003-03-12 14:14) [0]Взялся потихоньку делать локальную читалку HTML-страниц для CD-версии своей базы данных... Ориентируюсь на использование FreePascal, но пока пишу так, чтобы код компилился в рабочую прогу и на D6. Налетел на странные "грабли".
FreePascal пока некорректно работает с WideString, поэтому с этим типом напрямую работать нельзя. А я пытаюсь вызвать из MSHTML.DLL функцию ShowHTMLDialog, которая получает одним из параметром Variant c "WideChar"ной" начинкой. Поэтому я решил собрать Variant вручную:
InParam_data.VType:=8;
InParam_data.VPointer:=_items0;
где _items0 - указатель на...
А вот от того, на что указывает _items0, зависит успех вызова данной функции. Если он указывает на статический массив символов
(значащий,#0,значащий,#0,...,#0#0#0), или на массив с аналогичным содержанием, сделанный через GetMem и даже через CoTaskMemAlloc - на выходе EAccessViolation in module oleaut32.dll. Но если переменной _items0 присвоен результат преобразования в pWideChar некой строки типа WideString - всё OK. Я даже эксперимента ради вынес эту строку в отдельную, написанную мной на D6, DLL и получал адрес как результат вызова соответствующей функции из этой моей DLL - всё работает, даже если EXE скомпилирован FreePascal"ем. В чем же хитрость, как избавиться от явных WideString?
← →
REA (2003-03-12 14:29) [1]Щас буду глупости говорить, поскольку нет возможности разобрасться детально в проблеме (хотя когда я редактор DHTML на VC++ писал, тоже забодался с этими вариантами).
Оно видимо использует какую-то глобальную память типа GlobalAddAtom, а не локальную типа GetMem. А вообще может посмотреть как устроена работа с вариантами сделана в C++ или в Delphi и попробовать повторить?
← →
nikkie (2003-03-12 14:53) [2]память надо аллокировать через SysAllocString.
For VT_BSTR, there is only one owner for the string. All strings in variants must be allocated with the SysAllocString function. When releasing or changing the type of a variant with the VT_BSTR type, SysFreeString is called on the contained string.
а конвертацию в WideChar лучше сделать с помощью MultiByteToWideChar.
← →
PVOzerski (2003-03-12 15:22) [3]2nikkie:
Кажется, это то, что надо. Спасибо!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.03.24;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.009 c