我在C#中具有以下接口(interface)方法声明:

[ComVisible(true), ComImport, SuppressUnmanagedCodeSecurity,
Guid("A668B8F2-BA87-4F63-9D41-768F7DE9C50E"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface ILAVAudioStatus
{
    [PreserveSig]
    int GetOutputDetails(out IntPtr pOutputFormat, out int pnChannels, out int pSampleRate, out uint pChannelMask);
}

pOutputformat实际上是C++中的char **

我需要做一个Marshal.PtrToStringAnsi(pOutputformat)以获取实际的字符串。

是否有一些编码属性可以将pOutputformat直接转换为输出字符串,而不是使用IntPtr?

这是C++方法的作用:
HRESULT CLAVAudio::GetOutputDetails(const char **pOutputFormat, int *pnChannels, int *pSampleRate, DWORD *pChannelMask)
{
  if(!m_pOutput || m_pOutput->IsConnected() == FALSE) {
    return E_UNEXPECTED;
  }
  if (m_avBSContext) {
    if (pOutputFormat) {
      *pOutputFormat = get_sample_format_desc(SampleFormat_Bitstream);
    }
    return S_FALSE;
  }
  if (pOutputFormat) {
    *pOutputFormat = get_sample_format_desc(m_OutputQueue.sfFormat);
  }
  if (pnChannels) {
    *pnChannels = m_OutputQueue.wChannels;
  }
  if (pSampleRate) {
    *pSampleRate = m_OutputQueue.dwSamplesPerSec;
  }
  if (pChannelMask) {
    *pChannelMask = m_OutputQueue.dwChannelMask;
  }
  return S_OK;
}

最佳答案

Marshal.PtrToStringAnsi(pOutputformat)

是您所能做的最好的。这是不可避免的。如果尝试封送为out string OutputFormat,则封送员将在本机代码返回的指针上调用CoTaskMemFree。最终以眼泪结束。

问题仍然是谁负责释放pOutputformat指向的内存?只有您知道答案。

有人怀疑为什么这个COM接口(interface)的设计者选择使用C字符串而不是COM BSTR

关于c# - 以更人性化的方式编码char **,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21890022/

10-12 16:02