как использовать функции обратного вызова из DLL cpp в Python - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь использовать DLL, написанную на cpp внутри python, используя ctype. Однако некоторые ошибки видны

У меня есть код в cpp, что я переписываю небольшую часть в python.

Ошибка отображается при инициализации регистрации DLL.

C код: https://ideone.com/RLgM5u

import os
import sys
from ctypes import *
import ctypes as c
import time

bAtivo = False
bMarketConnected = False

class TAssetID(c.Structure):
    _fields_ = [
        ("ticker", c.c_wchar_p),
        ("bolsa", c.c_wchar_p)]

dll = cdll.LoadLibrary("ProfitDLL")


@c.CFUNCTYPE(None, TAssetID, c.c_wchar_p, c.c_float, c.c_float, c.c_int, c.c_int, c.c_int, c.c_int)
def newTradeCallback(assetId, date,  price, vol, qtd, buyAgent, sellAgent, tradeType):
    print('oi')

@c.CFUNCTYPE(None, TAssetID, c.c_wchar_p, c.c_float, c.c_float, c.c_float, c.c_float, c.c_float, c.c_float, c.c_float, c.c_float, c.c_int, c.c_int, c.c_int, c.c_int, c.c_int, c.c_int, c.c_int, c.c_int)
def newDailyCallback(assetId, date, sOpen, sHigh, sLow, sClose, sVol, sAjuste, sMaxLimit,  sMinLimit, sVolBuyer, sVolSeller, nQtd, nNegocios, nContratosOpen, nQtdBuyer, nQtdSeller, nNegBuyer, nNegSeller):
    print('oi')

@c.CFUNCTYPE(None, TAssetID, c.c_wchar_p, c.c_float, c.c_float, c.c_int, c.c_int, c.c_int, c.c_int)
def newHistoryCallback(assetId, date, price, vol, qtd, buyAgent, sellAgent, tradeType):
    print('oi')

@c.CFUNCTYPE(None, TAssetID, c.c_int)
def progressCallBack(assetId, nProgress):
    print('oi')

@c.CFUNCTYPE(None, TAssetID, c.c_float, c.c_int, c.c_int)
def newTinyBookCallBack(assetId, proce, qtd, side):
    print('oi')

@c.CFUNCTYPE(None, c.c_int, c.c_int)
def stateCallback(nConnStateType, result):

    if nConnStateType == 0: # notificacoes de login
        if result == 0:
            print("(0-0) Login: Conectado.")

        if result == 1:
            print("(0-1) Login: Login invalido.")

        if result == 2:
            print("(0-2) Login: Senha invalida")

        if result == 3:
            print("(0-3) Login: Senha bloqueada")

        if result == 4:
            print("(0-4) Login: Senha expirada")

        if result == 200:
            print("(0-200) Login: Erro desconhecido")

    if nConnStateType == 1: # notificacoes de broker
        if result == 0:
            print("(1-0) Broker: Desconectado.")

        if result == 1:
            print("(1-1) Broker: Connectando")

        if result == 2:
            print("(1-2) Broker: Conectado")

        if result == 3:
            print("(1-3) Broker: Desconectado")

        if result == 4:
            print("(1-4) Broker: Conectando")

        if result == 5:
            print("(1-5) Broker: Conectado")

    if nConnStateType == 2:  # notificacoes de login no Market
        if result == 4:
            print("(2-4) State: Conectado ao Profit")
            time.sleep(3000)
            bMarketConnected = True
        else:
            print("(2-" + result + ") State: Desconectado.")
            bMarketConnected = False

    if nConnStateType == 3: # notificacoes de login no Market
        if result == 0:
            print("(3-0) Atividade: Valida.")
            bAtivo = True
        else:
            print("(3-" +result+ ") Atividade: Invalida.")
            bAtivo = False

    if (nConnStateType == 3 or nConnStateType == 2) and (bAtivo and bMarketConnected):
        dll.SubscribeTicker("WINM20","F")


Code = "d5646546556164654"
keystr = c_wchar_p(Code)


dll.InitializeMarket(keystr, stateCallback, newTradeCallback, newDailyCallback, newHistoryCallback, newTinyBookCallBack)

Traceback (последний вызов был последним): файл ". \ AplicationTrader.py", строка 104, в dll.InitializeMarket (keystr, stateCallback, newTradeCallback, newDailyCallback, newHistoryCallback, newTinyBookCallBack) ValueError: Процедура, вызываемая с недостаточным количеством аргументов (28 байт отсутствует) или неверное соглашение о вызовах

Я очень благодарен за внимание.

...