Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.013 c
1-76418
Kamchadal
2003-03-11 15:51
2003.03.24
Помогите пожалуйста


1-76425
Mike2003
2003-03-11 12:40
2003.03.24
TCanvas или TImage


1-76442
Zbigniew Bonek
2003-03-08 03:49
2003.03.24
rtf to txt


3-76265
Вопрошающий
2003-03-05 17:34
2003.03.24
Проверка подключения ADOConnection.


3-76369
galexis
2003-03-04 19:13
2003.03.24
загрузка из файла xml




   Наверх