TOP комментариев

+1
Глупый вопрос — а как стандартными методами получить серийник на Symbol?
avatar

kel

  • 21 мая 2012, 16:50
+1
В среду напишу подробно с примерами варианты как это сделать, сейчас сильно занят. Там в зависимости от выбранной стратегии либо будет быстрее работать, либо код значительно проще. Я правильно понимаю — файл со справочником в вашем случае лежать будет на ТСД?..
Потому что если на сервере — то лучше работать с какой либо из баз данных.
avatar

Roman

  • 30 апреля 2012, 14:07
0
Вопрос, кстати не глупый, однако метод будет действовать не на всех устройствах, у некоторых производителей выдаёт всегда одинаковый номер. Например на Cipher. Но на Symbol/Motorola — работает, проверено.
avatar

Roman

  • 21 мая 2012, 22:31
0
Как-то так:
class SerialNumber
    {



        private static Int32 METHOD_BUFFERED = 0;
        private static Int32 FILE_ANY_ACCESS = 0;
        private static Int32 FILE_DEVICE_HAL = 0x00000101;

        private const Int32 ERROR_NOT_SUPPORTED = 0x32;
        private const Int32 ERROR_INSUFFICIENT_BUFFER = 0x7A;

        private static Int32 IOCTL_HAL_GET_DEVICEID =
            ((FILE_DEVICE_HAL) << 16) | ((FILE_ANY_ACCESS) << 14)
            | ((21) << 2) | (METHOD_BUFFERED);

        [DllImport("coredll.dll", SetLastError = true)]
        private static extern bool KernelIoControl(Int32 dwIoControlCode,
            IntPtr lpInBuf, Int32 nInBufSize, byte[] lpOutBuf,
            Int32 nOutBufSize, ref Int32 lpBytesReturned);

        public static string GetDeviceID()
        {
            byte[] outbuff = new byte[20];
            Int32 dwOutBytes;
            bool done = false;

            Int32 nBuffSize = outbuff.Length;

            BitConverter.GetBytes(nBuffSize).CopyTo(outbuff, 0);
            dwOutBytes = 0;

            while (!done)
            {
                if (KernelIoControl(IOCTL_HAL_GET_DEVICEID, IntPtr.Zero,
                    0, outbuff, nBuffSize, ref dwOutBytes))
                {
                    done = true;
                }
                else
                {
                    int error = Marshal.GetLastWin32Error();
                    switch (error)
                    {
                        case ERROR_NOT_SUPPORTED:
                            throw new NotSupportedException(
                                "IOCTL_HAL_GET_DEVICEID is not supported on this device",
                                new Win32Exception(error));

                        case ERROR_INSUFFICIENT_BUFFER:

                            nBuffSize = BitConverter.ToInt32(outbuff, 0);
                            outbuff = new byte[nBuffSize];

                            BitConverter.GetBytes(nBuffSize).CopyTo(outbuff, 0);
                            break;

                        default:
                            throw new Win32Exception(error, "Unexpected error");
                    }
                }
            }

            Int32 dwPresetIDOffset = BitConverter.ToInt32(outbuff, 0x4);
            Int32 dwPresetIDSize = BitConverter.ToInt32(outbuff, 0x8);
            Int32 dwPlatformIDOffset = BitConverter.ToInt32(outbuff, 0xc);
            Int32 dwPlatformIDSize = BitConverter.ToInt32(outbuff, 0x10);
            StringBuilder sb = new StringBuilder();

            for (int i = dwPresetIDOffset;
                i < dwPresetIDOffset + dwPresetIDSize; i++)
            {
                sb.Append(String.Format("{0:X2}", outbuff[i]));
            }

            sb.Append("-");

            for (int i = dwPlatformIDOffset;
                i < dwPlatformIDOffset + dwPlatformIDSize; i++)
            {
                sb.Append(String.Format("{0:X2}", outbuff[i]));
            }
            return sb.ToString();
        }

        private void DeviceID_Load(object sender, System.EventArgs e)
        {
            try
            {
                string strDeviceID = GetDeviceID();
                MessageBox.Show("Device ID: " + strDeviceID);

                string deviceName = System.Net.Dns.GetHostName();
                MessageBox.Show("Device Name: " + deviceName);
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message.ToString());
            }
        }
    }


Потребуются какие то из этих модулей:
using System.Runtime.InteropServices;
using System.Diagnostics;


Используя класс выше, получаем серийник так:
string dev_id = SerialNumber.GetDeviceID();
avatar

Roman

  • 21 мая 2012, 22:28
0
Roman подскажите пожалуйста, как сделать запрос с переменной неопределенного типа.

Пытаюсь сделать запрос такого рода

string SQL = "START TRANSACTION; ";
SQL = SQL + "INSERT INTO tovar (name) VALUES ('test'); ";
SQL = SQL + " SELECT @idtovar:=(last_insert_id()) from tovar; ";
SQL = SQL + " INSERT INTO postup (idTovar) VALUE (@idtovar); ";
SQL = SQL + "COMMIT";
MySqlLib.MySqlData.MySqlExecute.MyResult result = new MySqlLib.MySqlData.MySqlExecute.MyResult();
result = MySqlLib.MySqlData.MySqlExecute.SqlNoneQuery(SQL, database_str);


В phpMyAdmin все прекрасно работает

в c# выдает ошибку: Fatal error encountered during command execution.
avatar

One1690

  • 6 мая 2012, 01:38
0
Да Роман Вы правильно поняли, дело в том что 2 числа приезжает начальник (большой:-)) мне дали в руки MC3190 и сказали что бы я продемонстрировал его работу, просто поставят продукцию видов пять и остальное Вы наверное поняли. После его отъезда нужно будет все делать нормально но сейчас просто времени нет.
avatar

volodya82

  • 30 апреля 2012, 19:37
0
огромное спасибо все работает, но у меня в данный момент стоит задача чтобы ТСД вывел не только штрих код но и название, хотя бы наименований пять, т.е. брал с файла. Роман не могли бы вы мне помочь в решении данной проблемы?
avatar

volodya82

  • 30 апреля 2012, 13:22