Ошибка при тестировании Trans2QuikAPI

Страницы: 1
RSS
Ошибка при тестировании Trans2QuikAPI, Ошибка: A call to PInvoke function...............
 
Добрый день! Тестирую Trans2QuikAPI в простом проекте с двумя кнопками: Connect и Disconnect. Проект на VB.Net. За основу взял код VBA из примера в Excel.  С потоками проблема. Поэтому следующую ошибку не могу побороть, подскажите, как решить проблему.

Ошибка: A call to PInvoke function 'ПроектAPI.Form1::TRANS2QUIK_IS_QUIK_CONNECTED' has unbalanced the stack. This is likely because the managed PInvoke signature does not match the unmanaged target signature. Check that the calling convention and parameters of the PInvoke signature match the target unmanaged signature.

Код
Код:[CODE]Public Class Form1
    Public Const TRANS2QUIK_SUCCESS = 0
    Public Const TRANS2QUIK_FAILED = 1
    Public Const TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND = 2
    Public Const TRANS2QUIK_DLL_VERSION_NOT_SUPPORTED = 3
    Public Const TRANS2QUIK_ALREADY_CONNECTED_TO_QUIK = 4
    Public Const TRANS2QUIK_WRONG_SYNTAX = 5
    Public Const TRANS2QUIK_QUIK_NOT_CONNECTED = 6
    Public Const TRANS2QUIK_DLL_NOT_CONNECTED = 7
    Public Const TRANS2QUIK_QUIK_CONNECTED = 8
    Public Const TRANS2QUIK_QUIK_DISCONNECTED = 9
    Public Const TRANS2QUIK_DLL_CONNECTED = 10
    Public Const TRANS2QUIK_DLL_DISCONNECTED = 11
    Public Const TRANS2QUIK_MEMORY_ALLOCATION_ERROR = 12
    Public Const TRANS2QUIK_WRONG_CONNECTION_HANDLE = 13
    Public Const TRANS2QUIK_WRONG_INPUT_PARAMS = 14
    Public TransStr As String
    Dim PathToInfo As String
    Dim FunctionResult As Long
    Dim FunctionResultString As String
    Dim pnExtendedErrorCode As Long
    Dim lpstrErrorMessage As String = Mid(lpstrErrorMessage, 250)
    Public Const dwErrorMessageSize = 250
    Dim nReturnCode As Long
    Dim dwTransID As Long
    Dim dOrderNum As Double
    Dim lpstrResultMessage As String = Mid(lpstrResultMessage, 250)                          
    Const dwResultMessageSize = 250
    Dim curRow As Long
    Dim g_nOrdersCount As Long
    Dim g_nTradesCount As Long
 
 
    Public Declare Function TRANS2QUIK_CONNECT Lib "D:\...Проект\Resources\TRANS2QUIK.dll" _
    Alias "_TRANS2QUIK_CONNECT@16" _
    (ByVal lpstConnectionParamsString As String, _
     ByRef pnExtendedErrorCode As Long, _
     ByVal lpstrErrorMessage As String, ByVal dwErrorMessageSize As Long) As Long
 
    Public Declare Function TRANS2QUIK_DISCONNECT Lib "D:\...Проект\Resources\TRANS2QUIK.dll" _
     Alias "_TRANS2QUIK_DISCONNECT@12" _
     (ByRef pnExtendedErrorCode As Long, _
     ByVal lpstrErrorMessage As String, ByVal dwErrorMessageSize As Long) As Long
 
Public Function Trans2QuikResultToStr(ByVal Num As Long) As String
        If Num = 0 Then Trans2QuikResultToStr = "TRANS2QUIK_SUCCESS"
        If Num = 1 Then Trans2QuikResultToStr = "TRANS2QUIK_FAILED"
        If Num = 2 Then Trans2QuikResultToStr = "TRANS2QUIK_QUIK_TERMINAL_NOT_FOUND"
        If Num = 3 Then Trans2QuikResultToStr = "TRANS2QUIK_DLL_VERSION_NOT_SUPPORTED"
        If Num = 4 Then Trans2QuikResultToStr = "TRANS2QUIK_ALREADY_CONNECTED_TO_QUIK"
        If Num = 5 Then Trans2QuikResultToStr = "TRANS2QUIK_WRONG_SYNTAX"
        If Num = 6 Then Trans2QuikResultToStr = "TRANS2QUIK_QUIK_NOT_CONNECTED"
        If Num = 7 Then Trans2QuikResultToStr = "TRANS2QUIK_DLL_NOT_CONNECTED"
        If Num = 8 Then Trans2QuikResultToStr = "TRANS2QUIK_QUIK_CONNECTED"
        If Num = 9 Then Trans2QuikResultToStr = "TRANS2QUIK_QUIK_DISCONNECTED"
        If Num = 10 Then Trans2QuikResultToStr = "TRANS2QUIK_DLL_CONNECTED"
        If Num = 11 Then Trans2QuikResultToStr = "TRANS2QUIK_DLL_DISCONNECTED"
        If Num = 12 Then Trans2QuikResultToStr = "TRANS2QUIK_MEMORY_ALLOCATION_ERROR"
        If Num = 13 Then Trans2QuikResultToStr = "TRANS2QUIK_WRONG_CONNECTION_HANDLE"
        If Num = 14 Then Trans2QuikResultToStr = "TRANS2QUIK_WRONG_INPUT_PARAMS"
        Return 0
    End Function
 
Private Sub cmdConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdConnect.Click
        On Error Resume Next
        PathToInfo = "C:\Quik\info.exe"
        FunctionResult = TRANS2QUIK_CONNECT(PathToInfo, pnExtendedErrorCode, lpstrErrorMessage, dwErrorMessageSize)
        FunctionResultString = Trans2QuikResultToStr(FunctionResult)
        MsgBox("F: " & vbCrLf & _
                "FunctionResult = " & FunctionResult & vbCrLf & _
                "FunctionResultString = " & FunctionResultString & vbCrLf & _
                "pnExtendedErrorCode = " & pnExtendedErrorCode & vbCrLf & _
                "lpstrErrorMessage = " & lpstrErrorMessage)
        g_nOrdersCount = g_nTradesCount = 1
    End Sub
 
 
    Private Sub cmdChekConnectDell_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdChekConnectDell.Click
        FunctionResult = TRANS2QUIK_IS_DLL_CONNECTED(pnExtendedErrorCode, lpstrErrorMessage, dwErrorMessageSize)
        FunctionResultString = Trans2QuikResultToStr(FunctionResult)
        MsgBox("F: " & vbCrLf & _
                "FunctionResult = " & FunctionResult & vbCrLf & _
                "FunctionResultString = " & FunctionResultString & vbCrLf & _
                "pnExtendedErrorCode = " & pnExtendedErrorCode & vbCrLf & _
                "lpstrErrorMessage = " & lpstrErrorMessage)
    End Sub
End Class  
[/CODE]
 
Как-то странно, у вас текст ошибки про TRANS2QUIK_IS_QUIK_CONNECTED, а в тексте программы её вообще нет. Где-то обман видится мне.

Вероятнее всего не хватает уточнения про CallingConvention.
Попробуйте заменить описание функций вот на такое примерно, пример для TRANS2QUIK_CONNECT (не проверял, надеюсь мне удалось правильно соорудить синтаксис для VB):

<DllImport("D:\...Проект\Resources\TRANS2QUIK.dll", CallingConvention:=CallingConvention.StdCall, EntryPoint:="_TRANS2QUIK_CONNECT@16")> _
Public Shared Function TRANS2QUIK_CONNECT( ByVal lpstConnectionParamsString As String, _
    ByRef pnExtendedErrorCode As Long, _
    ByVal lpstrErrorMessage As String, ByVal dwErrorMessageSize As Long) As Long
End Function


Кстати, если я не ошибаюсь, на .NET можно в один проект включать и VB.NET файлы, и C#
Если так - то просто возьмите готовый заголовочный файл библиотеки от arqa (есть в архиве), там есть пример на C#, подключите его, там есть готовые правильные определения интерфейса. Ну разве что выкинуть из него что-то, что лишнее, т.к. там, к сожалению, не чистый заголовочник.
 
DLLImport не пойдет, потому-что Trans2QuikAPI.dll у меня в Проекте находится. А  TRANS2QUIK_IS_QUIK_CONNECTED - это на автомате, т.к. стал пробовать другие функции. Ошибка та же.
 
НЕ силен в английском, но signature по моему говорит о не совпадении типов. Это мое предположение.
 
Цитата
Алексей Смирнов написал:
DLLImport не пойдет, потому-что Trans2QuikAPI.dll у меня в Проекте находится.
Это не понял.
В DLLImport  явно же указано место, откуда брать DLL. Исправьте на нужное - вот и всё.
 
Место(где находится dll) явно указано при декларировании каждой функции.
 
Ну да.
И? в чем остались затруднения? не понятно.
 
Ошибка: A call to PInvoke function  'ПроектAPI.Form1::TRANS2QUIK_CONNECTED' has unbalanced the  stack. This is likely because the managed PInvoke signature does not  match the unmanaged target signature. Check that the calling convention  and parameters of the PInvoke signature match the target unmanaged  signature.
 
Цитата
Алексей Смирнов написал:
Ошибка: A call to PInvoke function  'ПроектAPI.Form1::TRANS2QUIK_CONNECTED' has unbalanced the  stack. This is likely because the managed PInvoke signature does not  match the unmanaged target signature. Check that the calling convention  and parameters of the PInvoke signature match the target unmanaged  signature.
Добрый день.

Проверьте тип данных для функции TRANS2QUIK_CONNECTED, тип должен быть Long.
 
В коде, в начале темы, видно, что тип функции TRANS2QUIK_CONNECTED = Long.
 
Цитата
Алексей Смирнов написал:
В коде, в начале темы, видно, что тип функции TRANS2QUIK_CONNECTED = Long.
Алексей, на наших примерах проверяли?
С приведенной ошибкой не сталкивались, но в интернете она на форумах обсуждается.
 
в документации на C#
http://msdn.microsoft.com/ru-ru/library/exx3b86w.aspx
http://msdn.microsoft.com/ru-ru/library/ctetwysk.aspx

тип Long описан как 64-разрядное целое число со знаком имеющим размер 8 байт

А в документации на C++
тип Long описан как 32-разрядное целое число со знаком имеющим размер 4 байт.
http://msdn.microsoft.com/ru-ru/library/s3f49ktz.aspx

таким образом нужно помнить что если в документации написано Long, это не значит что нужно указывать именно Long
 
Операционная система: Win7_32-разрядная версия. Проект на VB.Net. Visual Studio 32-разрядная.
Вопрос_1: в Excel пример для какой разрядности?
Вопрос_2: какой тип функции установить в моем случае?  
 
Цитата
Алексей Смирнов написал:
Операционная система: Win7_32-разрядная версия.
Не совсем понятно причем тут разрядность операционной системы, когда мы говорим о типах данных
Цитата
Алексей Смирнов написал:
Вопрос_1: в Excel пример для какой разрядности?
Это легко увидеть в самом примере
Цитата
Алексей Смирнов написал:
Вопрос_2: какой тип функции установить в моем случае?
нужен Long 32-разрядное целое число со знаком имеющим размер 4 байт.
 
Поменял везде в функциях кода тип Long на Integer. Все заработало.
Спасибо.
Тема закрыта.
Страницы: 1
Читают тему
Наверх