Главная страница
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.014 c
9-76254
kronic
2002-10-23 08:48
2003.03.24
как написать движок для RPG игы


8-76522
Gayrus
2002-12-13 10:30
2003.03.24
Bass


14-76610
TGrigory
2003-03-06 13:08
2003.03.24
А реально программисту дожить до пенсии?


3-76320
Lans
2003-03-05 10:34
2003.03.24
Срочно!!! Какая функция в TTable показывает, что ячейка выделена!


3-76261
dash78
2003-03-04 07:59
2003.03.24
Создание нового юзера