我在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/