TeamSpeak3客户端SDK——ts3client_startConnection()的defaultChannel

本文关键字:defaultChannel startConnection 客户端 SDK ts3client TeamSpeak3 | 更新日期: 2023-09-27 18:03:52

我正在尝试使用与默认通道不同的通道连接到我的TeamSpeak3服务器。

医生说:

-defaultChannelArray

定义到TeamSpeak 3服务器上通道的路径的字符串数组。如果通道存在,并且用户有足够的权限并提供正确的密码,则该通道将在登录时加入。

要定义任意级别的子通道的路径,创建一个通道名称数组,详细说明默认通道的位置(例如:"祖父母","父母","mydefault",")。数组以一个空字符串结束。

传递NULL来加入服务器的默认通道。

函数签名如下:

unsigned int ts3client_startConnection(uint64 serverConnectionHandlerID,     
                                       const char* identity,     
                                       const char* ip,   
                                       unsigned int port,    
                                       const char* nickname,     
                                       const char** defaultChannelArray,     
                                       const char* defaultChannelPassword,   
                                       const char* serverPassword);  

TeamSpeak的c#示例工作得很好,它使用了这样的方法:

string defaultarray = "";
/* Connect to server on localhost:9987 with nickname "client", no default channel, no default channel password and server password "secret" */
error = ts3client.ts3client_startConnection(scHandlerID, identity, "localhost", 9987, "client", ref defaultarray, "", "secret");
if (error != public_errors.ERROR_ok) {
    Console.WriteLine("Error connecting to server: 0x{0:X4}", error);
    Console.ReadLine();
    return;
}

在他们的代码中导入DLL时,他们使用:

[DllImport("ts3client_win32.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "ts3client_startConnection", CharSet = CharSet.Ansi)]
public static extern uint ts3client_startConnection(uint64 arg0, string identity, string ip, uint port, string nick, ref string defaultchannelarray, string defaultchannelpassword, string serverpassword);

现在我的问题:使用c#,我试图传递非默认通道数组的方法,但它不是工作得很好。

我尝试了以下方法,但都无济于事:

string defaultarray = """name"", """"";
string defaultarray = "name,";

我总是得到一个错误当做任何事情除了:

string defaultarray = "";

类型为"System"的未处理异常。AccessViolationException'发生在ts3_client_minimal_sample.exe

附加信息:试图读写受保护的内存。这通常表明其他内存已损坏。

如何从c#到c++ DLL获得字符串数组,而不使用string []?

谢谢!

TeamSpeak3客户端SDK——ts3client_startConnection()的defaultChannel

谢谢你,凤凰!

原来的答案没有帮助,但下面的答案有帮助:esskar的答案

更新代码:

[DllImport("ts3client_win32.dll", CallingConvention =   CallingConvention.Cdecl, EntryPoint = "ts3client_startConnection", CharSet = CharSet.Ansi)]
public static extern uint ts3client_startConnection(uint64 arg0, string identity, string ip, uint port, string nick, string[] defaultchannelarray, string defaultchannelpassword, string serverpassword);
...
string[] defaultarray = new string[] { "name", ""};
/* Connect to server on localhost:9987 with nickname "client", no default channel, no default channel password and server password "secret" */
error = ts3client.ts3client_startConnection(scHandlerID, identity, "localhost", 9987, "client", defaultarray, "password", "secret");
if (error != public_errors.ERROR_ok) {
    Console.WriteLine("Error connecting to server: 0x{0:X4}", error);
    Console.ReadLine();
    return;
}

基本上,我将DllImport从ref string defaultChannelArray更改为string[] defaultChannelArray。正如那个线程的另一个评论者提到的,c#数组是作为引用传递的。然后我传递了一个简单的c#字符串数组。完美的工作!

我把它弄得太复杂了