【发布时间】:2014-02-19 19:08:56
【问题描述】:
我在 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;
}
【问题讨论】:
-
取决于方法使用参数的方式,
out StringBuilder可以工作。 -
out stringBuilder 使应用程序崩溃,而 stringBuilder 只是返回一个用指针而不是值填充的 stringBuilder(4 个字节的垃圾)。
-
是的,这可能会发生。编组输出参数有点烦人,因为它取决于处理它的方法以及它是分配内存还是调用函数。
-
C++ 中的方法正如您所期望的那样将指向其内部字符串的指针放入 pOutputformat,然后我使用 PtrToStringAnsi 读取它。我只是想知道是否有办法以某种方式将参数声明为输出字符串,因为它显然不适用于“输出字符串”
-
您不能调用 C++ 实例方法。当它访问 m_Output 和 m_avBSContext 成员时它不会崩溃是盲目的运气。这不会很好地重复。
标签: c# c++ string marshalling