Я работаю над надстройкой Microsoft Word на основе C ++ / ATL в Visual Studio 2010. Я также использую COleDispatchDriver
на основе MFC и поддерживаю классы и использую ClassWizard Visual Studio для генерации классов-оболочек из Microsoft Wordбиблиотека типов.Пример оболочки для функции Selection.Move, сгенерированной ClassWizard, приведен ниже.
long Move(VARIANT * Unit, VARIANT * Count)
{
long result;
static BYTE parms[] = VTS_PVARIANT VTS_PVARIANT ;
InvokeHelper(0x6d, DISPATCH_METHOD, VT_I4, (void*)&result, parms, Unit, Count);
return result;
}
Для функций, подобных приведенной выше, я также написал вспомогательные функции, обеспечивающие передачу аргумента VARIANT, как показано ниже..
long Move(int Unit, int Count)
{
long result;
static BYTE parms[] = VTS_PVARIANT VTS_PVARIANT ;
VARIANT vaUnit;
::VariantInit(&vaUnit);
vaUnit.vt = VT_I4;
vaUnit.iVal = Unit;
VARIANT vaCount;
::VariantInit(&vaCount);
vaCount.vt = VT_INT;
vaCount.iVal = Count;
InvokeHelper(0x6d, DISPATCH_METHOD, VT_I4, (void*)&result, parms, &vaUnit, &vaCount);
::VariantClear(&vaUnit);
::VariantClear(&vaCount);
return result;
}
Когда я вызываю свою функцию с положительным целым числом для параметра Count
, Word отвечает правильно, например, следующий вызов функции переместит выделение «вперед» (к концу документа)на один символ.
m_oSelection.Move(1 /* wdCharacter */, 1);
Однако, если я попытаюсь переместить выделение на один символ «назад» (к началу документа) с помощью следующего вызова функции, Word не будет отвечать ожидаемым образом.
m_oSelection.Move(1 /* wdCharacter */, -1);
«Похоже», автоматизация Word рассматривает целое число как целое число без знака, и мое значение -1 становится 65535, вызывая скачок выбора вперед.Проверяя вариант vaCount
в строке с вызовом функции InvokeHelper
, отладчик VS показывает значение .iVal
как -1, но «значение» варианта vaCount
отображается как 65535.
Чего мне не хватает, чтобы надлежащим образом передать отрицательное целое число как часть вызова функции COM?