2017-02-22 61 views
0

Я пытаюсь сделать login в телефоне. Я развиваюсь в c#, а библиотека находится в C++. Функция «lineDevSpecific» возвращает значение «-2147483595», но оно должно быть положительным.Ошибка в строкеDevSpecific (логин в телефоне)

[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)); 

ответ

0

Это постоянная LINEERR_ см MSDN LINEERR_ Constants page

Они используют шестнадцатеричный без знака «0x8000 00xx» стиль, превращая их отрицательна, если смотреть на них как знаковое междунар.

Так это один 0x8000 0035 LINEERR_INVALPOINTER

Ваш HLine неправильно, это дескриптор строки не текст в указателе. Вы должны получить его из Центра обновления lineOpen

для версии 2

Вы путаете hLineApp и HLine. От lineOpen MSDN:

hLineApp: Обращайтесь к регистрации приложения с TAPI.

lphLine: указатель на дескриптор HLINE, который затем загружается ручкой, представляющей устройство открытой линии. Используйте этот дескриптор для идентификации устройства при вызове других функций на устройстве открытой линии.

+0

Хорошо, спасибо. Я изменил код добавления сообщения. У меня две строки: Ip Office Phone: 201 и Ip Office Phone: 202. Я понимаю, что lineApp является начальным значением 0 («Line 201»), и после этого мне нужно отправить по ссылке значение lineApp. – rhdez7

+0

lineDefSpecific имеет параметр mire, который вы предоставили. См. Https://msdn.microsoft.com/en-us/library/ms735604(v=vs.85).aspx – xMRi

+0

rhdez7, могу ли я предложить вам взглянуть на http://atapi.codeplex.com/. не идеально, но это лучший пример, который я знаю о работе с TAPI из .NET. Это может помочь вам с некоторыми из основ –