Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Указатели / 11 сообщений из 11, страница 1 из 1
21.02.2014, 10:05
    #38568426
INFINITs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатели
Добрый день, подскажите по теме указателей, что-то до меня не доходит.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 static class Program
{
[DllImport("Блабла.dll")]
unsafe public static extern int AddRecipient(void* ctx, int type, void* param1, void* param2);
[DllImport("Блабла.dll")]
unsafe public static extern void* Test(); 
[STAThread]
static void Main()
}

private void button1_Click(object sender, EventArgs e)
{ string v_str ="Любой текст";
 unsafe 
{  void* ctx_e = Program.Test();  
void* v_patch=(string*)&v_str;
er = Program.AddRecipient(ctx_e, 0, v_patch, null);
}
}       



ругается на void* v_patch=(string*)&v_str;
"Невозможно получить адрес, определить размер или объявить указатель на управляемый тип ("string")
...
Рейтинг: 0 / 0
21.02.2014, 11:43
    #38568586
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатели
Зачем тут указатели?

Platform Invoke Tutorial
...
Рейтинг: 0 / 0
22.02.2014, 01:49
    #38569261
INFINITs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатели
Библиотека написано не мной и она принимает указатели.
Переписать ее нет возможности.
...
Рейтинг: 0 / 0
22.02.2014, 02:55
    #38569264
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатели
INFINITsругается на void* v_patch=(string*)&v_str;
"Невозможно получить адрес, определить размер или объявить указатель на управляемый тип ("string") Тут:
Pointer types (C# Programming Guide)In an unsafe context, a type may be a pointer type, a value type, or a reference type. A pointer type declaration takes one of the following forms:
Код: c#
1.
2.
type* identifier;
void* identifier; //allowed but not recommended

Any of the following types may be a pointer type:
sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, or bool.

Any enum type.

Any pointer type.

Any user-defined struct type that contains fields of unmanaged types only.

Pointer types do not inherit from object and no conversions exist between pointer types and object. Also, boxing and unboxing do not support pointers. However, you can convert between different pointer types and between pointer types and integral types.
Заодно почитайте и посмотрите примеры тут - Platform Invoke Tutorial
INFINITsБиблиотека написано не мной и она принимает указатели.
Переписать ее нет возможности.А показать "оригинальную" сигнатуру?
...
Рейтинг: 0 / 0
22.02.2014, 03:38
    #38569272
INFINITs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатели
sphinx_mv,

Спасибо почитаю, надеюсь разберусь.

авторА показать "оригинальную" сигнатуру?

У меня имеется только dll и описание

Функция AddRecipient добавляет получателя зашифрованных данных к заданному контексту шифрования.
MPFUN int MPAPI AddRecipient(
void *CTX,
int Type,
void *Param1,
void *Param2
);
Параметры
CTX
[in] Указатель на контекст, созданный функцией GetCipherCTX.
Type
[in] Определяет способ задания получателя.
BY_FILE - Абонент задается именем файла сертификата в параметре Param1, параметр Param2 не используется.
Param1
[in] См. описание параметра Type.
Param2
[in] См. описание параметра Type.
...
Рейтинг: 0 / 0
22.02.2014, 09:03
    #38569309
INFINITs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатели
Переделал. Просьба оценить корректность.
И кому несложно слегка объяснить, недоконца понимаю, ведь библиотека на Си принимает указатель.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
static class Program
{
[DllImport("Блабла.dll", EntryPoint = "Test")]
public static extern IntPtr Test2(); 
[DllImport("Блабла.dll")]
public static extern int AddRecipient([MarshalAs(UnmanagedType.AsAny)] object ctx, int type, [MarshalAs(UnmanagedType.AsAny)] object param1, [MarshalAs(UnmanagedType.AsAny)] object param2);
[DllImport("Блабла.dll", EntryPoint = "AddRecipient")]
public static extern int AddRecipient2(IntPtr ctx, int type, string s, string b);


[STAThread]
static void Main()
...
}


private void button1_Click(object sender, EventArgs e)
{ string v_str ="Путь к файлу";
 IntPtr ctx_e = Program.Test2();
 er = Program.AddRecipient2(ctx_e, 0, v_str , null);
}
...
Рейтинг: 0 / 0
22.02.2014, 13:04
    #38569378
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатели
INFINITssphinx_mv,

Спасибо почитаю, надеюсь разберусь.

авторА показать "оригинальную" сигнатуру?

У меня имеется только dll и описание

Функция AddRecipient добавляет получателя зашифрованных данных к заданному контексту шифрования.
MPFUN int MPAPI AddRecipient(
void *CTX,
int Type,
void *Param1,
void *Param2
);
Параметры
CTX
[in] Указатель на контекст, созданный функцией GetCipherCTX.
Type
[in] Определяет способ задания получателя.
BY_FILE - Абонент задается именем файла сертификата в параметре Param1, параметр Param2 не используется.
Param1
[in] См. описание параметра Type.
Param2
[in] См. описание параметра Type.

Это что, MessagePro? там вроде все проще, через Marshal и иже с ним. void* - это IntPtr
...
Рейтинг: 0 / 0
22.02.2014, 16:33
    #38569505
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатели
INFINITsБиблиотека написано не мной и она принимает указатели.
Переписать ее нет возможности.И что это меняет?
...
Рейтинг: 0 / 0
23.02.2014, 08:25
    #38569719
INFINITs
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатели
Arm79Это что, MessagePro? там вроде все проще, через Marshal и иже с ним. void* - это IntPtr
Т.е. мой второй пример вполне корректный, так можно писать?

Алексей КИ что это меняет?
Это было сказано, чтобы не было предложений ее переписать.
...
Рейтинг: 0 / 0
23.02.2014, 17:41
    #38569881
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатели
INFINITsАлексей КИ что это меняет?
Это было сказано, чтобы не было предложений ее переписать.Дано две ссылки на .Net Platform Invoke, на русском и английском, как удобнее. Необходимость применения указателей на дотнетной стороне в этой задаче маловероятна. Переписывать ничего не надо.
...
Рейтинг: 0 / 0
24.02.2014, 10:16
    #38570124
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатели
INFINITs,

Чуть-чуть рабочего кода для MessagePro
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
        [DllImport(_dll_name, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, EntryPoint = "GetCipherCTX")]
        internal static extern IntPtr GetCipherCTX();

        [DllImport(_dll_name, CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, EntryPoint = "AddRecipient")]
        internal static extern int AddRecipient(IntPtr cipher_ctx, CipherSourceTypes type, IntPtr param1, ref IntPtr param2);

    /// <summary>
    /// Тип источника для загрузки сертификатов
    /// </summary>
    public enum CipherSourceTypes
    {
        BY_FILE = 0,
        BY_SUBJECT = 1,
        BY_SERIAL = 2,
        BY_COMPONENTS = 3,
        BY_BUFFER = 4
    } ;

        public static int AddRecipientByBuffer(IntPtr cipher_ctx, byte[] certificate)
        {
            int _result;

            using (var helperCertificate = new MemoryHelper(certificate))
            {
                var _cert_len = new IntPtr(certificate.Length);
                _result = NativeMethods.AddRecipient(cipher_ctx, CipherSourceTypes.BY_BUFFER, helperCertificate.Data, ref _cert_len);
            }

            return _result;
        }

    /// <summary>
    /// Расширяющий метод, позволяющий преобразовать область памяти, на которую имеется указатель, в массив байт
    /// </summary>
    static class ByteHelper
    {
        /// <summary>
        /// Преобразование указателя на область неуправляемой памяти в массив байтов
        /// </summary>
        /// <param name="buffer">родительский тип</param>
        /// <param name="Data">Указатель на область неуправляемой памяти, в которой хранятся данные</param>
        /// <param name="DataLength">Длина данных, находящихся в области неуправляемой памяти и на которую ссылается <paramref name="Data"/></param>
        /// <returns>массив байтов</returns>
        public static byte[] ConvertFrom(this byte[] buffer, IntPtr Data, int DataLength)
        {
            var _result = new byte[DataLength];
            Marshal.Copy(Data, _result, 0, DataLength);
            WrappedMethods.FreeBuffer(Data);

            return _result;
        }

        /// <summary>
        /// Преобразование данных, на которые имеется указатель на область неуправлемой памяти, в строку
        /// </summary>
        /// <param name="data">Указатель</param>
        /// <returns>строка</returns>
        public static string ConvertToString(this IntPtr data)
        {
            var result = Marshal.PtrToStringAnsi(data);
            WrappedMethods.FreeBuffer(data);

            return result;
        }
    }

    /// <summary>
    /// Класс, инкапсулирующий работу с выделением памяти и копированием в нее массивов байт
    /// </summary>
    class MemoryHelper : IDisposable
    {
        #region Private Members

        private readonly IntPtr m_buffer;
        private readonly int m_buffer_length;

        #endregion

        #region .ctor

        /// <summary>
        /// Конструктор вспомогательного класса
        /// </summary>
        /// <param name="data">Буфер с данными, который компируется в область неуправляемой памяти</param>
        public MemoryHelper(byte[] data)
        {
            m_buffer = IntPtr.Zero;
            m_buffer_length = 0;

            if (data == null) return;

            m_buffer_length = data.Length;
            m_buffer = Marshal.AllocHGlobal(m_buffer_length);
            Marshal.Copy(data, 0, m_buffer, m_buffer_length);
        }
        
        #endregion

        #region Properties

        /// <summary>
        /// Указатель на память с данными
        /// </summary>
        public IntPtr Data
        {
            get { return m_buffer; }
        }

        /// <summary>
        /// Длина данных в памяти, на которую ссылается указатель <see cref="Data"/>
        /// </summary>
        public int DataLength
        {
            get { return m_buffer_length; }
        }

        /// <summary>
        /// Длина данных в памяти, на которую ссылается указатель <see cref="Data"/>, в виде указателя памяти
        /// </summary>
        public IntPtr DataLengthPtr
        {
            get { return new IntPtr(m_buffer_length);}
        }

        #endregion

        #region IDisposable Members

        public void Dispose()
        {
            if (m_buffer_length != 0)
                Marshal.FreeHGlobal(m_buffer);
        }

        #endregion
    }

...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Указатели / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]