ошибка DISP_E_ARRAYISLOCKED в AddPolyline()
От: Hedge  
Дата: 22.07.05 13:54
Оценка:
Проблема:
Автоматизация PowerPoint,
при попытке выполнить
pSlide->Shapes->AddPolyline( vcoords );

где vcoords — VARIANT в котором содержится SafeArray
Функция raw_AddPolyline возвращает код ошибки DISP_E_ARRAYISLOCKED

пользуюсь #import:
#import "MSO.DLL"
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
#import "MSPPT.OLB" \
        rename("ExitWindows","_ExitWindows")
#import "C:\Program Files\Common Files\Microsoft Shared\DAO\DAO360.DLL" \
        rename("EOF","EndOfFile") rename("BOF","BegOfFile")
#endif



Собственно код:
VARIANT vcoords;
V_VT(&vcoords)=VT_ARRAY|VT_VARIANT;

SAFEARRAYBOUND saBound[ 2 ] ;
saBound[ 0 ].cElements = 2 ;
saBound[ 0 ].lLbound = 0 ;
saBound[ 1 ].cElements = 2 ;
saBound[ 1 ].lLbound = 0 ;

vcoords.parray = SafeArrayCreate( VT_I4, 2, saBound ) ;

_variant_t coord[4]={20L,20L,100L,100L};

long arrPos[2];
arrPos[0] = 0;
arrPos[1] = 0;
hr=SafeArrayPutElement(vcoords.parray,arrPos,&coord[0]);
arrPos[0] = 1;
arrPos[1] = 0;
hr=SafeArrayPutElement(vcoords.parray,arrPos,&coord[1]);
arrPos[0] = 0;
arrPos[1] = 1;
hr=SafeArrayPutElement(vcoords.parray,arrPos,&coord[2]);
arrPos[0] = 1;
arrPos[1] = 1;
hr=SafeArrayPutElement(vcoords.parray,arrPos,&coord[3]);

PowerPoint::ShapePtr myShapePtr = pSlide->Shapes->AddPolyline( vcoords );



Не могу понять почему он LOCKED...
В чём же грабли??
Re: ошибка DISP_E_ARRAYISLOCKED в AddPolyline()
От: Vi2 Удмуртия http://www.adem.ru
Дата: 29.07.05 08:17
Оценка: 2 (1)
Здравствуйте, Hedge, Вы писали:

H>Автоматизация PowerPoint, при попытке выполнить

H>pSlide->Shapes->AddPolyline( vcoords );

H>где vcoords — VARIANT в котором содержится SafeArray
H>Функция raw_AddPolyline возвращает код ошибки DISP_E_ARRAYISLOCKED

Судя по представленному коду, такая ошибка невозможна и скорее всего является наведенной из-за других условий и сбоев.
Возможные ошибочные действия в том, что создается VARIANT и массив в нем с рассогласованием типов данных в них — vcoords.vt=VT_ARRAY|VT_VARIANT и vcoords.parray = SafeArrayCreate(VT_I4,...). Выделенные коды должны быть одинаковыми.

Также есть подозрение, что PowerPoint не работает с массивами, у которых нижний предел равен 0. Также возможно, что PowerPoint не работает с типом данных VT_I4. Последние подозрения основываются на MSDN примере (Dim triArray(1 To 4, 1 To 2) As Single ... ActivePresentation.Slides(1).Shapes.AddPolyline SafeArrayOfPoints:=triArray).

H>Собственно код:

H>VARIANT vcoords;
H>V_VT(&vcoords)=VT_ARRAY|VT_R4; \\Vi2 было VT_ARRAY|VT_VARIANT

H>SAFEARRAYBOUND saBound[ 2 ] ;
H>saBound[ 0 ].cElements = 2 ;
H>saBound[ 0 ].lLbound = 1; \\Vi2 было 0
H>saBound[ 1 ].cElements = 2 ;
H>saBound[ 1 ].lLbound = 1; \\Vi2 было 0

H>vcoords.parray = SafeArrayCreate( VT_R4, 2, saBound ); \\Vi2 было VT_I4

H>float coord[4]={20L,20L,100L,100L}; \\Vi2 было _variant_t

H>long arrPos[2];
H>arrPos[0] = 1; \\Vi2 было 0
H>arrPos[1] = 1; \\Vi2 было 0
H>hr=SafeArrayPutElement(vcoords.parray,arrPos,&coord[0]);
H>arrPos[0]++;
H>hr=SafeArrayPutElement(vcoords.parray,arrPos,&coord[1]);
H>arrPos[0] = 1; \\Vi2 было 0
H>arrPos[1] = 2; \\Vi2 было 1
H>hr=SafeArrayPutElement(vcoords.parray,arrPos,&coord[2]);
H>arrPos[0]++;
H>hr=SafeArrayPutElement(vcoords.parray,arrPos,&coord[3]);

H>PowerPoint::ShapePtr myShapePtr = pSlide->Shapes->AddPolyline( vcoords );

Хотя возможно, что должно сработать и с типом данных long (вместо float) и VT_I4 (вместо VT_R4), и с нижним индексом 0.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: ошибка DISP_E_ARRAYISLOCKED в AddPolyline()
От: Hedge  
Дата: 01.08.05 13:23
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Возможные ошибочные действия в том, что создается VARIANT и массив в нем с рассогласованием типов данных в них — vcoords.vt=VT_ARRAY|VT_VARIANT и vcoords.parray = SafeArrayCreate(VT_I4,...). Выделенные коды должны быть одинаковыми.


Vi2>Также есть подозрение, что PowerPoint не работает с массивами, у которых нижний предел равен 0. Также возможно, что PowerPoint не работает с типом данных VT_I4. Последние подозрения основываются на MSDN примере (Dim triArray(1 To 4, 1 To 2) As Single ... ActivePresentation.Slides(1).Shapes.AddPolyline SafeArrayOfPoints:=triArray).


Vi2>Хотя возможно, что должно сработать и с типом данных long (вместо float) и VT_I4 (вместо VT_R4), и с нижним индексом 0.


Заработало!
Изменение нижнего индекса на 1 видимого эффекта не оказало.
Сменил тип тип элемента на VT_R4 в vcoords.vt и SafeArrayCreate().

Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.