2013-08-23 7 views
-2

Im пытается получить OleVariant «массив объектов» У меня есть этот код на С ++, которые делают эту работу, но я не смог злословить его в Дельфы кодOleVariant на массив объекта

VARIANT vComps; 
HRESULT hr = swAssembly->GetComponents(VARIANT_TRUE, &vComps); 
IDispatch* HUGEP *pDispData; 
HRESULT hr = SafeArrayAccessData(vComps.parray, (void**)&pDispData); 
long bound = 0; 
hr = SafeArrayGetUBound(vComps.parray, 1, &bound); 
for (int i = 0; i < count; i++) 
{ 
    IComponent2 *nextComp = NULL; 
    hr = pDispData[i]->QueryInterface(IID_IComponent2, (void**)&nextComp); 
    //do stuff with Component pointer 
} 

Stijn Sanders предложить мне этот перевод:

var 
    vComps:OleVariant; 
    i:integer; 
    comp:IComponent2; 
begin 
    swAssembly.GetComponents(true,vComps); 
    for i:=VarArrayLowBound(vComps,1) to VarArrayHighBound(vComps,1) do 
    begin 
    comp:=IUnknown(vComps[i]) as IComponent2; 
    //do stuff with component 
    end; 

но функции были импортированы из файла tbl.

swAssembly.getComponents(const toplevelonly:boolean) 

и 'getcomponents' имеет только один параметр, то я не могу сделать

swAssembly.GetComponents(true,vComps); 

я попытался

vComps:=swAssembly.getComponents(true); 

с vComps как OleVariant типа (поскольку компилятор позволяет только этот тип) Ошибка при выполнении этой строки, но когда я пытаюсь читать vComps

Icom ponent2 (vComps [я])

я есть ошибка доступа ... я попытался небезопасный, но я их обнаружить и у меня есть некоторые трудности ...

+7

-1 Вы уже задавали этот вопрос. Стейн провел свое драгоценное время, написав ответ. Затем вы удалили вопрос, что сделало невозможным вознаграждение Стийна за его усилия. Это очень плохие манеры. –

+0

Большое спасибо Stijn Sanders! Но я думаю, что предыдущее сообщение было заблокировано вами, «приостановлено как не по теме», и я создал это новое, а не редактирование. Сожалею. Это мой первый вопрос о переполнении стека ... – Tokazio

+0

Да, приостановлено. Какая очередь для вас, чтобы отредактировать ее и устранить ее недостатки. Чтобы его можно было снова открыть. –

ответ

2

Попробуйте это:

vComps := swAssembly.GetComponents(true); 
for i := VarArrayLowBound(vComps, 1) to VarArrayHighBound(vComps, 1) do 
begin 
    comp := vComps[i] as IComponent2; 
    ... 
end; 
+0

+1 но было бы лучше, если бы вы объяснили метод перезаписи функции safecall –

+0

GetComponents (TopLevelOnly: WordBool): OleVariant; директива SafeCall; – Tokazio

-1
v := o[I] as IComponent2; 

дают ошибку компилятора

[DCC Error] Unit1.pas(62): E2015 Operator not applicable to this operand type 

то же самое для

v := Icomponent2(o[I]); 

с только для даного я могу компилировать, но у меня есть ошибки при входе в цикл

for I := VarArrayLowBound(o, 1) to VarArrayHighBound(o, 1) do 
begin 
end; 

class EVariantInvalidArgError with message 'Invalid argument'. 
+0

Я вставил точку останова после getComponents, и я вижу в компиляторе, что v не задано и длина (v) возвращает 0 – Tokazio

 Смежные вопросы

  • Нет связанных вопросов^_^