Передача указателя из управляемого C ++ / CLI в компонент ActiveX C ++ - PullRequest
1 голос
/ 26 мая 2011

У меня есть компонент ActiveX, встроенный в C ++.Один из его методов имеет такую ​​подпись:

short Component::Method(short FAR* ptr) {}

Когда я добавляю ActiveX в свое приложение C ++ / CLI, подпись метода отображается как:

short Compnenet::Method(short% ptr) {}

Я хочу иметь возможностьправильно передать короткий * pSomething;значение переменной для этого метода.конечно, новая подпись не принимает передаваемые аргументы как короткие *, и даже если вы попытаетесь привести к короткому%, это не даст правильных результатов.

Примечание: у меня нет доступа к activeXконтроль, чтобы изменить.Я могу только подтвердить значение адреса, которое получил метод activeX.Метод печатает переданное значение следующим образом:

short Component::Method(short FAR* ptr) {
    char buffer[128];
    sprintf_s(buffer, "address of ptr = %p\n", ptr);
    OutputDebugString(buffer);
}

1 Ответ

2 голосов
/ 29 мая 2011

Подпись функции недопустима для автоматизации ActiveX, массивы должны быть переданы как SAFEARRAY.Таким образом, функция не может быть вызвана никаким кодом, кроме собственного C / C ++.Преобразователь библиотеки типов имеет ту же проблему, сигнатура функции идентична той, в которой аргумент передается по ссылке.Невозможно догадаться, что это на самом деле массив.Вот почему вы получили короткий тип%.

Если вы не можете изменить собственный компонент, вам придется отредактировать библиотеку взаимодействия, созданную Tlbimp.exe.Это требует запуска ildasm.exe для декомпиляции DLL в IL.Отредактируйте объявление IL функции.Поместите Шалтай-Болтай вместе с ilasm.exe.Посмотрите на разборку маленькой тестовой функции с подписью, которая вам необходима, чтобы знать, как редактировать IL.Вам нужно будет передать аргумент как IntPtr и передать закрепленный массив.Используйте pin_ptr <>, чтобы получить этот указатель.

...