? задание строкового свойства из Delphi - PDLCSSetPropertyEx
Шимолин Сергей; 8.9.03

Из Delphi работаю с ODK-функциями PDLCSSetPropertyEx, PDLCSGetPropertyEx. При доступе к числовым свойствам всё отрабатывает нормально, при работе со строковыми свойствами какие-то проблемы.. Если кто работал - киньте работающий примерчик.

Спасибо.
Re: ? задание строкового свойства из Delphi - PDLCSSetPropertyEx
Alexis; 8.9.03

BSTR bstr=::SysAllocString(L"Ops!");

PDLCSSetPropertyEx(lpszProjectName,lpszPictureName,lpszObjectName,lpszPropName,VT_BSTR,&bstr,0,NULL,&wccError);
::SysFreeString(bstr);

Так пробовал?
Re: ? задание строкового свойства из Delphi - PDLCSSetPropertyEx
Шимолин Сергей; 9.9.03

У меня вобщем-то проблема была в вызове функции на pascal`e, а в документации все на C. Но всё равно спасибо, ответ навел на мысль - тип VT_BSTR на Delphi заменяется на WideString, а я работал с обычным String. Заработало всё вот так:


var
s : WideString;
begin
PDLCSGetPropertyEx( pchar(ProjectName), PAnsiChar(Form1.CurrPictureName), lpInfoStruct.szObjectName, 'Позиция', varOleStr, @s, 0, nil, @Error)
end;

И насчёт выделения памяти: здаётся мне специально выделять память не надо -
BSTR bstr=::SysAllocString(L"Ops!");

В документации написано:

For types which have a buffer (e.g. BSTR), the buffer is allocated by the function and must be cleared afterwards by the calling application.

Т.е. память выделяется внутри функции, а вот освобождать её как раз должны мы.
Re: ? задание строкового свойства из Delphi - PDLCSSetPropertyEx
Alexis; 9.9.03

В дока много чего написано :))

BSTR все равно надо инициализировать...

BSTR bstr=::SysAllocString(NULL);
PDLCSGetPropertyEx(...,VT_BSTR,&bstr...);
::SysFreeString(bstr);
Re: ? задание строкового свойства из Delphi - PDLCSSetPropertyEx
Alexis; 9.9.03

А хотя можно и не инициализировать... GetProperty сам все сделает...

Кстати, наскоко я помню не все строковые свойства VT_BSTR, некоторые VT_LPSTR...