0

我想login在电话里做。我正在开发,c#图书馆在C++. 函数"lineDevSpecific" 返回值 "-2147483595",但它必须是正数。

[DllImport("Tapi32.dll", SetLastError = true)]
    unsafe private static extern int lineDevSpecific(IntPtr hLine, IntPtr lpParams);

    [StructLayout(LayoutKind.Sequential)]
    public struct UserRec
    {
        //[MarshalAs(UnmanagedType.I4)]
        public int dwMode=8;
        public int dwParam1=201;
        public int dwParam2=0;
    }

    unsafe static void Iniciar()
    {

        string vline = "Ip Office Phone: 201";
        IntPtr hline = System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(vline);

        var sizeUserRec = Marshal.SizeOf(typeof(UserRec));
        var userRec = Marshal.AllocHGlobal(sizeUserRec);
        int result=lineDevSpecific(hline, userRec);
        var x = (UserRec)Marshal.PtrToStructure(userRec, typeof(UserRec));
        Marshal.FreeHGlobal(userRec);
    }

版本 2:

我修改了最初的帖子,添加了 lineInitializeEx 方法和 lineOpen。这些方法返回一个正值,在此 lineDevSpecific 继续返回相同的值之后。

[DllImport("Tapi32.dll", CharSet = CharSet.Auto)]
    unsafe private static extern long lineInitializeEx(ref uint lphLineApp, uint hInstance, uint lpfnCallback, uint lpszFriendlyAppName, ref uint lpdwNumDevs, ref uint lpdwAPIVersion, ref uint lpLineInitializeExParams);
    [DllImport("Tapi32.dll", SetLastError = true)]
    internal static extern long lineOpen(ref uint hLineApp, uint dwDeviceID, uint lphLine, uint dwAPIVersion, uint dwExtVersion, uint dwCallbackInstance, uint dwPrivileges, uint dwMediaModes, ref uint lpCallParams);
    [DllImport("Tapi32.dll", CharSet = CharSet.Auto)]
    unsafe private static extern int lineDevSpecific(uint hLine, IntPtr lpParams);
        uint lineApp = 0;
        uint numdevs = 0;
        uint apiversion = 0;
        uint exparams = 0;
        uint lpcallparams = 0;
        string sParams = "";
        long lSize = 0;
        long inicio = lineInitializeEx(ref lineApp, 0, 0, 0, ref numdevs, ref apiversion, ref exparams);
        if (inicio > 0)
        {
            long open = lineOpen(ref lineApp, 0, 0, 0, 0, 0, 0, 0, ref lpcallparams);
            //string vline = "Ip Office Phone: 201";
            //IntPtr hline = System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(vline);

            var sizeUserRec = Marshal.SizeOf(typeof(UserRec));
            var userRec = Marshal.AllocHGlobal(sizeUserRec);
            int result = lineDevSpecific(lineApp, userRec);
            var x = (UserRec)Marshal.PtrToStructure(userRec, typeof(UserRec));
            Marshal.FreeHGlobal(userRec);
        }

解决方案:我已致电 Julmar Atapi。

string extension = "201";
            char[] c = new char[extension.Length + 2];
            c[0] = (char)0x08; //login character

            int i = 1;
            foreach (char s in extension)
            {
                c[i] = s;
                i++;
            }
            c[i] = (char)0x00; //null terminator
            CurrentAddress.DeviceSpecific(Encoding.ASCII.GetBytes(c));
4

1 回答 1

0

那是一个 LINEERR_ 常量,请参阅MSDN LINEERR_ 常量页面

这些使用十六进制无符号“0x8000 00xx”样式,如果您将它们视为有符号整数,则将它们变为负数。

所以这个是 0x8000 0035 LINEERR_INVALPOINTER

您的 hline 错误,这是行的句柄,而不是指针中的文本。您需要从lineOpen获取它

版本 2 的更新

您正在混淆 hLineApp 和 hLine。从lineOpen MSDN

hLineApp:应用程序向 TAPI 注册的句柄。

lphLine:指向 HLINE 句柄的指针,然后加载代表打开的线路设备的句柄。调用开线设备上的其他功能时,使用此句柄来识别设备。

于 2017-02-23T07:22:09.210 回答