Я изучаю автоматизацию C ++ PowerPoint на основе этого примера кода
Мне все кажется ясным, но у меня проблема, когда я пытаюсь изменить шаблон по умолчанию на свой пользовательский шаблон, сохраненный на диске. Я написал следующую строку:
AutoWrap(DISPATCH_METHOD, NULL, pPres, L"ApplyTheme", 1, L"D:\\template.thmx" );
которая воспроизводит эту рабочую линию от VBA:
Call pptPres.ApplyTheme("D:\template.thmx")
Проблема в том, что на этой линии происходит сбой приложения.
Редактировать:
Нашел проблему (глупая), но все равно программа вылетает после ее исправления.
pPres должен быть типом презентации, а не презентациями (которые являются коллекцией презентаций).
Проблема теперь в этой строке в функции AutoWrap (полный код предоставлен по ссылке выше)
// Make the call
hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT,
autoType, &dp, pvResult, NULL, NULL);
После попадания в эту строку я получаю необработанное исключение и разрывы приложения на LeaveCriticalSection в _unlock в mlock.c.
Из приведенного вами примера вы не можете передать строку wchar_t * в качестве параметра функции, которую вы хотите вызвать в AutoWrap, вам нужно упаковать ее как тип BSTR, который имеет разную структуру памяти, что и строка wchar_t *, поэтому это приведет к краху.
Правильный путь в приведенном вами примере:
VARIANT x;
x.vt = VT_BSTR;
x.bstrVal = SysAllocString(L"All-In-One Code Framework");
AutoWrap(DISPATCH_PROPERTYPUT, NULL, pTxtRange, L"Text", 1, x);
VariantClear(&x);
Других решений пока нет …