Проблема:
Автоматизация 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...
В чём же грабли??
Здравствуйте, 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.
Здравствуйте, 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().
Спасибо!