Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
1-76428
yaric
2003-03-11 20:51
2003.03.24
Освобождение ресурсов


9-76251
Джастер
2002-10-26 21:39
2003.03.24
D3D вместо DirectDraw


7-76682
Volhv
2003-01-29 11:00
2003.03.24
Завершение работы Windows


1-76377
_stranger_
2003-03-13 03:59
2003.03.24
Отчеты!!!!!!!!


8-76523
Arthur1
2002-12-13 10:25
2003.03.24
Как получить амплитуду звука?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский