代码之家  ›  专栏  ›  技术社区  ›  Marino Å imić

以更人性化的方式编组字符**

  •  1
  • Marino Å imić  · 技术社区  · 11 年前

    我在C#中有以下接口方法声明:

    [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;
    }
    
    1 回复  |  直到 11 年前
        1
  •  1
  •   David Heffernan    11 年前
    Marshal.PtrToStringAnsi(pOutputformat)
    

    这是你能做的最好的。这是无法避免的。如果您尝试封送为 out string OutputFormat 然后编组员会呼叫 CoTaskMemFree 在本机代码返回的指针上。这一切都以眼泪结束。

    问题仍然是谁负责释放 pOutputformat 指向?只有你才能知道答案。

    有人想知道为什么这个COM接口的设计者选择使用C字符串而不是COM BSTR .