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

Вниз

Трабл при попытке использования собранного   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.021 c
3-76312
ki11er
2003-03-03 21:24
2003.03.24
вопрос про TSession


3-76348
Dim!S
2003-03-04 03:41
2003.03.24
Поиск части строки


3-76316
sergey32
2003-03-05 11:50
2003.03.24
Проблемма с dbExpress


7-76679
Arkady
2003-01-28 16:56
2003.03.24
Пароль


9-76245
Tihas
2002-10-24 02:01
2003.03.24
Вопросик по оптимальному алгоритму вывода тора?