не оставьте в беде! как подключить С++ dll?

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

не оставьте в беде! как подключить С++ dll?

Сообщение Floyd » 26.10.2011 (Ср) 16:56

всем привет.
есть длл написанная на C++, позволяющая управлять девайсом.
есть к ней описание функций.
надо подконнектить к девайсу. вот мой код:
Код: Выделить всё
Imports System.Runtime.InteropServices

Public Class Form1
    <DllImport("devlib.dll", EntryPoint:="devOpen", CharSet:=CharSet.Unicode)> _
    Private Shared Function devOpen(ByVal ip As String, ByVal player As String, ByRef handle As Long) As Long
    End Function
...
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim i_err As Long = 0, h_ as Object
        i_err = devOpen("10.1.0.1", "Player_1", h_)
    End Sub
End Class

как оно работает на примере, написанном на С++: функция хочет два стринга ип и имя плеера, 3й параметр - возвращаемый хендлер.
сама фунцкция возвращает код ошибки (0 == всё ок).
есть описание в АПИ функции от вендора.
на строке
Код: Выделить всё
  i_err = devOpen("10.1.0.1", "Player_1", h_)

получаю ошибку Вызов функции PInvoke "proj!WindowsApplication1.Form1::devOpen" разбалансировал стек. Вероятно, это вызвано тем, что управляемая сигнатура PInvoke не совпадает с неуправляемой целевой сигнатурой. Убедитесь, что соглашение о вызовах и параметры сигнатуры PInvoke совпадают с неуправляемой целевой сигнатурой.
почитал много форумов, MSDN, вроде всё понимаю, но не знаю как это победить.
1) я не уверен, что кодировка Unicode. возможно Ansi. как это выяснить?
2) в правильном формате ли я ей передаю ип и имя плеера? возможно нужны указатели. как это сделать?
3) коды ошибок i_err в виде 0x904B. 16тиричные, насколько я понимаю. как правильно объявить эту переменную?
помогите пожалуйста, уточняйте любые моменты. докуументация на руках и Сишный рабочий код тоже.
Спасибо!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: не оставьте в беде! как подключить С++ dll?

Сообщение Viper » 26.10.2011 (Ср) 18:31

Как миниммум меняй Long на Integer. Ну и хотелось бы видеть прототип.
Весь мир матрица, а мы в нем потоки байтов!

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 26.10.2011 (Ср) 21:17

Вероятно, функция на С++ описана как cdecl, что требует освобождения стека после её вызова вызывающей стороной.

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re: не оставьте в беде! как подключить С++ dll?

Сообщение Floyd » 27.10.2011 (Чт) 9:08

а как понять cdecl это или нет
и освободить стек?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: не оставьте в беде! как подключить С++ dll?

Сообщение FireFenix » 27.10.2011 (Чт) 10:33

Floyd писал(а):а как понять cdecl это или нет

1) Посмотреть описание библиотеки или узнать у разработчика
2) Вручную перебрать вызовы соглашений, чтобы не падало
3) Пройтись отладчиком и посотреть
Floyd писал(а):и освободить стек?

1) Использовать правильное соглашение вызова
2) Передавать правильные параметры функции
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re: не оставьте в беде! как подключить С++ dll?

Сообщение Floyd » 27.10.2011 (Чт) 12:20

Разработчик не доступен...
А как перебрать вызовы соглашений? Для меня это новое понятие? Есть ртфм?

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re: не оставьте в беде! как подключить С++ dll?

Сообщение Floyd » 27.10.2011 (Чт) 12:27

upd:
поменял на
Код: Выделить всё
Private Shared FunctiondevOpen(ByVal ip As String, ByVal player As String, ByVal handle As IntPtr) As Integer
-
ошибка
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
ругань на хендлер вроде...
что не так?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 27.10.2011 (Чт) 13:49


FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: не оставьте в беде! как подключить С++ dll?

Сообщение FireFenix » 27.10.2011 (Чт) 14:25

Floyd писал(а):А как перебрать вызовы соглашений? Для меня это новое понятие? Есть ртфм?

Wiki + MSDN

Floyd писал(а):что не так?

1) Не правильная сигнатура функции
2) Не правильно соглашение вызова
3) Не верно используешь получаемые данные
4) Не верно работает библиотека
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re:

Сообщение Floyd » 27.10.2011 (Чт) 15:17

Qwertiy писал(а):Эту тему видел?

да, прочитал всё от и до. даже скачал пример.
но он под вб6, у меня дотнет.
проситал вики и мсдн. нутром чувтсвую, что литр, а как сказать не знаю (с)...
Сделал следуюущее: нарыл попсовый пример с хеллоуворлд. запустил - работает. окошко вылазит.
дописал свой вызов:
Код: Выделить всё
Imports System
Imports System.Runtime.InteropServices

Module Example

    ' Use DllImport to import the Win32 MessageBox function.
    <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
    Function MessageBox(ByVal hwnd As IntPtr, ByVal t As String, ByVal caption As String, ByVal t2 As UInt32) As Integer
    End Function
    <DllImport("devlib.dll", CharSet:=CharSet.Unicode, CallingConvention:=CallingConvention.Cdecl)> _
    Function devOpen(ByVal ip As String, ByVal player As String, ByVal handle As IntPtr) As Integer
    End Function


    Sub Main()
        Dim h_ As IntPtr
        Dim i_err As Integer
        i_err = devOpen("10.1.0.1", "Player_1", h_)

        ' Call the MessageBox function using platform invoke.
        Dim h_1 As IntPtr
        MessageBox(h_1, "Hello World!", "Hello Dialog", 0)
    End Sub

End Module

в лоад_форме просто стоит Call Main()
так вот. идешь отладкой по шагам - на строке i_err = devOpen("10.1.0.1", "Player_1", h_)
виснет в задумчивость и всё. и ни ошибки, ни смены знаечения переменной.
комментишь эту строку - чётко вылазит хеллоуворлд нижний.
как еще в бубен побить? какие параметры можно погонять попробовать?
спасибо.

Floyd
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 23.04.2009 (Чт) 10:50

Re: не оставьте в беде! как подключить С++ dll?

Сообщение Floyd » 28.10.2011 (Пт) 15:19

ау

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: не оставьте в беде! как подключить С++ dll?

Сообщение FireFenix » 28.10.2011 (Пт) 18:17

Читать документацию к библиотеке. Если библиотека левая неизвестно кем написанная, значит ищите другие методы получения функционала аналогичного библиотечной
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList