【发布时间】:2010-05-31 02:28:46
【问题描述】:
faacEncConfigurationPtr FAACAPI faacEncGetCurrentConfiguration(
faacEncHandle hEncoder);
我正在尝试为这个 C++ 库提供一个简单的包装器;我以前从来没有做过比非常简单的 p/invoke 互操作更多的事情——比如一个带有原始参数的函数调用。
那么,以上面的C++函数为例,如何处理返回类型和参数呢?
FAACAPI 定义为:#define FAACAPI __stdcall
faacEncConfigurationPtr 已定义:
typedef struct faacEncConfiguration
{
int version;
char *name;
char *copyright;
unsigned int mpegVersion;
unsigned long bitRate;
unsigned int inputFormat;
int shortctl;
psymodellist_t *psymodellist;
int channel_map[64];
} faacEncConfiguration, *faacEncConfigurationPtr;
AFAIK 这意味着函数的返回类型是对该结构的引用?
而 faacEncHandle 是:
typedef struct {
unsigned int numChannels;
unsigned long sampleRate;
...
SR_INFO *srInfo;
double *sampleBuff[MAX_CHANNELS];
...
double *freqBuff[MAX_CHANNELS];
double *overlapBuff[MAX_CHANNELS];
double *msSpectrum[MAX_CHANNELS];
CoderInfo coderInfo[MAX_CHANNELS];
ChannelInfo channelInfo[MAX_CHANNELS];
PsyInfo psyInfo[MAX_CHANNELS];
GlobalPsyInfo gpsyInfo;
faacEncConfiguration config;
psymodel_t *psymodel;
/* quantizer specific config */
AACQuantCfg aacquantCfg;
/* FFT Tables */
FFT_Tables fft_tables;
int bitDiff;
} faacEncStruct, *faacEncHandle;
所以在这个结构中我们看到了很多其他类型......嗯。
基本上,我想弄清楚如何在我的托管包装器中处理这些类型?
我是否需要在 C# 中创建这些类型/结构的版本?像这样的:
[StructLayout(LayoutKind.Sequential)]
struct faacEncConfiguration
{
uint useTns;
ulong bitRate;
...
}
如果是这样,那么运行时是否可以自动将这些对象“映射”到彼此上? 而且,我是否必须为这些返回类型/参数类型层次结构中的所有类型创建这些“映射”类型,一直到我得到所有原语?
我知道这是一个广泛的话题,任何关于快速了解我需要学习什么以实现这一目标的建议将不胜感激!谢谢!
【问题讨论】:
标签: c# .net c++ interop pinvoke