Вы, вероятно, должны пометить символ * как строку, чтобы получить некоторую помощь с маршалингом.
foo([in] unsigned long ulSize, [in,string,size_is(ulSize)] unsigned char* pData)
Мы не используем опцию size_is в IDL, возможно, она вызывает проблему с ненулевым адресом?
foo([in] unsigned long ulSize, [in,string] unsigned char* pData)
Я бы определенно рекомендовал использовать BSTR или SAFEARRAY, а не char. Тогда проблема будет в том, как лучше всего обработать этот пустой случай, возможно, обработав его так же, как пустую строку, или используя отдельный метод.
Передача указателей в COM очень плохая форма, например, передача указателя с использованием разделяемой памяти (потенциально / вероятный) удаленный процесс не будет иметь доступа к памяти. Таким образом, COM пытается помочь, используя для вас фактические данные, но если вы спрятали их за другим типом данных, они не будут правильно обрабатывать данные. Например, используя wchar_t *, он создаст выделенную системой строку, доступную между процессами. или вы можете сделать то же самое и получить интерфейс, принимающий bstring и передавающий ему результат sysallocstring ()
Возможно, вы могли бы рассказать нам больше о структуре, которую вы хотите использовать, возможно, было бы более целесообразно расширить интерфейс com объектами этого типа. Или может быть какая-то другая хитрость в мартиаллинге для передачи данных, вы можете написать собственные методы мартиллинга для сериализации и десериализации контента.