Re[16]: И снова передача структуры с массивом в unmanaged фу
От: Аноним  
Дата: 28.11.06 11:56
Оценка:
По ходу событий...

Объявляю структуру так


    [StructLayout(LayoutKind.Explicit)]
    public struct UDT3
    {
        [FieldOffset(0)]
        public short rxStatus;
        [FieldOffset(2)]
        public byte datalen;
        [FieldOffset(3)]
        public IntPtr dataPtr;
    }



--генерируется ошибка, а если так

[StructLayout(LayoutKind.Explicit)]
public struct UDT3
{
[FieldOffset(0)]
public short rxStatus;
[FieldOffset(2)]
public byte datalen;
[FieldOffset(4)]
public IntPtr dataPtr;
}

то всё ок, получается byte в памяти 2 байта занимает?
Re[17]: И снова передача структуры с массивом в unmanaged фу
От: Аноним  
Дата: 28.11.06 12:33
Оценка:
Что-то ни одного MVP нет. Повымерли все что ли или вопрос слишком сложный?
Re: И снова передача структуры с массивом в unmanaged функци
От: Аноним  
Дата: 28.11.06 13:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Итак, есть библиотка и в ней некая unmanaged функция Command, с которой надо поработать на C#. К этой функции есть описание и пример работы на


Чтобы не гадать, было бы здорово, если бы вы привели оригинальное описание функции и типов ее параметров.
Re[2]: И снова передача структуры с массивом в unmanaged фун
От: Аноним  
Дата: 28.11.06 13:35
Оценка:
А>Чтобы не гадать, было бы здорово, если бы вы привели оригинальное описание функции и типов ее параметров.

Оригинальное описание из документации

Command
Function title: Command
Parameters: Command structure, UDT
Return value: UDT containing return data. The datalen parameter is the number of bytes in the data array. The data array, array1 contains the return data.
Function Description: Sends an SSP command to an open serial port. The UDT data structure is loaded with the data length (how many bytes in the command array). The command array contains the command and any data. rxStatus is set to the SSP address of the slave device (defaults to 0)

Visual Basic declaration:

Public Declare Function Command Lib "InnTechSSP.dll" (Src As UDT) As UDT
'Example usage for Visual Basic:
Public Const POLL_CMD = &H7
Public Const OK = &HF0
' the user defined structure
Public Type UDT
rxStatus As Integer
datalen As Byte
array1(254) As Byte
End Type
Dim Cpy As UDT, Src as UDT
' send Poll command
Src.datalen = 1
Src.array1(0) = POLL_CMD
Cpy = Command(Src)
If Cpy.array1(0) <> OK Then
MsgBox "Validator comms error", vbCritical, App.ProductName
CloseComm
Exit Function
End If
' Cpy.Array1 now contains the event list for the slave
Re[2]: И снова передача структуры с массивом в unmanaged фун
От: SQWO  
Дата: 28.11.06 14:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Итак, есть библиотка и в ней некая unmanaged функция Command, с которой надо поработать на C#. К этой функции есть описание и пример работы на


А>Чтобы не гадать, было бы здорово, если бы вы привели оригинальное описание функции и типов ее параметров.


А самый рабочий вариант дает поиск в Google


    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
    public class UDT
    {
        [MarshalAs(UnmanagedType.U2)]
        public short rxStatus;
        [MarshalAs(UnmanagedType.U1)]
        public byte dLen;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 254)]
        public byte[] data = new byte[254];
    }



        [DllImport("InnTechSSP.dll", CharSet = CharSet.Auto)]
        public static extern int Command(UDT udt, ref UDT cpy);



            UDT cmd = new UDT();
            UDT ret = new UDT();

            cmd.rxStatus = 0;
            cmd.dLen = 1;
            cmd.data[0] = 7;

            try
            {
                Console.WriteLine( "Started" );

                Console.WriteLine( "cmd.rxStatus = " + cmd.rxStatus );
                Console.WriteLine( "cmd.dLen     = " + cmd.dLen );
                Console.WriteLine( "cmd.data[0]  = " + cmd.data[0] );
                Console.WriteLine( "cmd.data[1]  = " + cmd.data[1] );
                Console.WriteLine( "cmd.data[2]  = " + cmd.data[2] );
                Console.WriteLine( "cmd.data[3]  = " + cmd.data[3] );

                
                ValidatorClass.OpenPort( 1 );

                try
                {


                    ValidatorClass.Command( cmd, ref ret );



                        Console.WriteLine( "ret.rxStatus = " + ret.rxStatus );
                              Console.WriteLine( "ret.dLen     = " + ret.dLen );
                        Console.WriteLine( "ret.data[0]  = " + ret.data[0] );
                        Console.WriteLine( "ret.data[1]  = " + ret.data[1] );
                        Console.WriteLine( "ret.data[2]  = " + ret.data[2] );
                        Console.WriteLine( "ret.data[3]  = " + ret.data[3] );
                }
                catch (Exception ex)
                {
                    ValidatorClass.CloseComm();
                    throw ex;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine( ex.Message );
                Console.WriteLine( ex.StackTrace );
            }
            Console.WriteLine( "Finished" );
            Console.ReadLine();
Re[3]: И снова передача структуры с массивом в unmanaged фун
От: Аноним  
Дата: 28.11.06 14:32
Оценка:
Сейчас попробую, конечно, но в Google я искал, ничё не нашёл толкового.
Впрочем, сейчас гляну...
Re[4]: И снова передача структуры с массивом в unmanaged фун
От: SQWO  
Дата: 28.11.06 14:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Сейчас попробую, конечно, но в Google я искал, ничё не нашёл толкового.

А>Впрочем, сейчас гляну...

Я искал по "InnTechSSP.dll"

в числе прочего нашлось вот это
http://www.developmentnow.com/g/21_2004_11_0_0_9725/problem-converting-code.htm

это вселяет уверенность, что ты не одинок

На том примере, что я привел все работает без исключений как для существующего порта,
так и для несуществующего.

А уж правильность результата — это тебе виднее — у меня в обоих случаях пустой
массив возвратился (dLen = 0).
Re[3]: И снова передача структуры с массивом в unmanaged фун
От: Аноним  
Дата: 28.11.06 14:42
Оценка:
Работает, хотя почему именно так импортируется эта функция — не ясно.

И ещё — данных-то и в этом варианте нет. Т.е. в возвращённой структуре dLen=0 один чёрт, а там что-то должно быть.

Console.WriteLine( "ret.dLen = " + ret.dLen );


Ладно, утро вечера мудренее, с утра уже...
Но все равно спасибо за участие
Большое!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.