Компонентная модель объекта Invoke [duplicate]

Собственно, это именно то, чего вы ожидаете. Давайте разложим, что здесь происходит:

Вы пишете

lst = [[1] * 4] * 3

Это эквивалентно:

lst1 = [1]*4
lst = [lst1]*3

Это означает, что lst - это список с 3 элемента, указывающие на lst1. Это означает, что две следующие строки эквивалентны:

lst[0][0] = 5
lst1[0] = 5

Поскольку lst[0] - это только lst1.

Чтобы получить желаемое поведение, вы можете использовать понимание списка:

lst = [ [1]*4 for n in xrange(3) ]

В этом случае выражение переоценивается для каждого n, что приводит к другому списку.

2
задан user3739214 9 July 2014 в 20:21
поделиться

1 ответ

Ты был на правильном пути. Комментарий @HansPassant указал мне на мгновение «эйрек», когда он предположил, что он взорвался по другому параметру. Первый и второй параметры имеют другой тип. Передано в обратном порядке для :: Invoke, они фактически являются вторым и третьим параметрами. Таким образом, это действительно взорвало мой параметр «1-го» с несоответствием типа.

В моей первоначальной версии концептуальной концепции я вручную передавал параметры, и я целенаправленно передавал параметры в обратном порядке, так как требуется IDispatch :: Invoke. В процессе преобразования этого в более общий подход, зацикливающийся на массив параметров, переданных от вызывающего, я менял порядок параметров ПОСЛЕ вызова вызова IDispatch :: Invoke, когда я возвращаю их в вызывающее приложение, однако, я забыл обратить вспять они по дороге до вызова Invoke.

Священные «вы-знаете-что» ошибки настолько эзотеричны для кого-то, у кого нет опыта работы с этим материалом!

Как только я исправил порядок параметров, все пошло точно так, как ожидалось. «Вариация 1» из моего вопроса была, конечно, правильным способом обработки параметра BSTR *. Для ясности здесь приведен правильный способ инициализации параметра варианта для параметра BSTR *, вызываемого IDispatch :: Invoke (в моем случае есть еще два параметра, которые здесь не показаны)

VARIANTARG* v = new VARIANTARG[3];
//...Init my first 2 args IN REVERSE (not shown here)

//Init my third arg which is the BSTR* parameter
VariantInit(v[0]);
BSTR val = SysAllocString(L"");
v[0].vt = VT_BSTR | BT_BYREF;
v[0].pbstrVal = &val;
3
ответ дан user3739214 21 August 2018 в 00:50
поделиться
  • 1
    Я думаю, что эта строка: v[0].vt = VT_BSTR | BT_BYREF должна читать VT_BSTR | VT_BYREF (VT_, а не BT_) – transistor1 31 January 2017 в 15:08
Другие вопросы по тегам:

Похожие вопросы: