Главная страница
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.025 c
1-76461
Ozone
2003-03-11 07:32
2003.03.24
TButton.Caption


3-76370
denis24
2003-03-05 17:33
2003.03.24
Tfield


1-76397
Starkom
2003-03-10 16:31
2003.03.24
Как простым образом конвертнуть битмап в строку?


6-76554
neodiX
2003-01-30 15:56
2003.03.24
Subnet mask & broadcast


3-76283
Softik
2003-03-04 13:32
2003.03.24
Подскажите на счет QReport-а! как в нем сделать типа выбора нужно