Извиняюсь за любые глупые ошибки, которые я допустил в своем коде - я новичок в DCOM и VC ++ в целом.Я знаю основы, но, к сожалению, этого недостаточно, чтобы понять это.
В настоящее время у меня есть некоторый код VC ++, который вызывает эквивалент этого в Powershell
$excel = [activator]::CreateInstance([type]::GetTypeFromProgID("Excel.Application", "127.0.0.1")); $excel.RegisterXLL("Path\to\x64\dll.dll")
.Теперь, если я использую этот фрагмент кода PS на обеих платформах x86 Powershell и x64 Powershell для COM-сервера x64, он, ну, в общем-то, работает.
Затем я попытался реплицировать его на C ++ и получил это далеко.Для пояснения, SimpleDLL - это чрезвычайно простая DLL, которая вызывает WinExec () в DLLmain и вызывает приложение калькулятора.
https://gist.githubusercontent.com/realoriginal/4178718ee114e3e23c5ebe4651763044/raw/425ce397ed4788c9fac25ae39dcfe1db779c8d99/source.c
Этот код работает нормально, если сервер x64 и его скомпилировали какдвоичный файл x64Кроме того, это также работает, если сервер x86, а двоичный файл скомпилирован в x86.
Проблемы начнут возникать, если я выберу сервер x64 с двоичным файлом x86.Я пытался использовать CLSCTX_ACTIVATE_32_BIT_SERVER
, но это совсем не работает, так как метод доступен только в x64.
С другой стороны, если я оставлю его как есть, он иногда работает,Чтобы объяснить, что я иногда имею в виду, вот мои результаты, которые я получаю от этого клиента x86, предназначенного для сервера Windows x64, вызывающего этот метод.
- Клиент вызывает НАРУШЕНИЕ ДОСТУПА с 0x000001 (понятия не имею, почему)
- Ошибки клиента в CoCreateInstanceEx () с
0x8007000E: Not enough storage is available to complete this operation.
- Он загружает DLL-библиотеку x64 и выскакивает калькулятор на удаленный сервер
У меня вопрос, чтоможет быть причиной сбоя в тех случаях, которые он сделал, и как я могу заставить его работать 100% времени с клиентом x86 по отношению к x64 COM + Windows Server?