簡體   English   中英

復雜C函數的P / Invoke映射(const void * text)

[英]P/Invoke mapping for complicated C function (const void *text)

我正在嘗試為eSpeak語音合成庫創建一個包裝器,到目前為止,我已經設法完成了諸如單個字符合成之類的簡單方法。 但是,主要的合成方法對我來說太復雜了,無法纏住我的頭。 有人對這個方法簽名的C#映射有很好的建議嗎? (特別是第一個變量!)

ESPEAK_API espeak_ERROR espeak_Synth(const void *text,
    size_t size,
    unsigned int position,
    espeak_POSITION_TYPE position_type,
    unsigned int end_position,
    unsigned int flags,
    unsigned int* unique_identifier,
    void* user_data);

espeak_POSITION_TYPE我已經映射到一個枚舉,並且我認為它可以工作。 以下是對文本變量的描述(如果有幫助的話):

text: The text to be spoken, terminated by a zero character. It may be either 8-bit characters,
  wide characters (wchar_t), or UTF8 encoding.  Which of these is determined by the "flags"
  parameter.

這取決於。

假設espeak_ERROR和espeak_POSITION_TYPE是整數:

[DllImport("...", CharSet=CharSet.Ansi)
static extern int espeak_Synth(string text,
    int text_length,
    int position,
    int position_type,
    int end_position,
    int flags,
    IntPtr unique_identifier,
    IntPtr user_data);

如果您將其傳遞給標志,則該文本為8位(而不是UTF)應該有效。

[DllImport("...")
static extern int espeak_Synth(IntPtr text,
    int text_length,
    int position,
    int position_type,
    int end_position,
    int flags,
    IntPtr unique_identifier,
    IntPtr user_data);
                                   // vv this can be some parameter
byte[] dat = Encoding.UTF8.GetBytes("some utf-8 string"             + "\0"); // note the trailing '\0'!
IntPtr pnt = Marshal.AllocHGlobal(dat.Length);
try {
    Marshal.Copy(dat, 0, pnt, dat.Length);
    espeak_Synth(pnt, dat.Length, .....); // assuming the text_length is in bytes. If in octets, pass the string's length
}
finally
{
    Marshal.FreeHGlobal(pnt);
}

如果要傳遞UTF-8字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM