簡體   English   中英

Ctypes-從Python傳遞空指針

[英]Ctypes - Passing a Void Pointer from Python

我正在Windows 7上使用Python Ctypes訪問C ++ DLL。我有該DLL的文檔,但實際上無法打開它。 我正在嘗試使用帶一個函數的C ++函數,該函數又帶一個無符號的int和一個void指針。 這是一個失敗的簡短代碼示例:

import ctypes
import os

root = os.path.dirname(__file__)
lib = ctypes.WinDLL(os.path.join(root, 'x86', 'toupcam.dll')) #works

cam = lib.Toupcam_Open(None) #works

def f(event, ctx): #Python version of function to pass in
    pass

#converting Python function to C function:
#CFUNTYPE params: return type, parameter types
func = ctypes.CFUNCTYPE(None, ctypes.c_uint, ctypes.c_void_p)(f)

res = lib.Toupcam_StartPullModeWithCallback(cam, func) #fails

每當我運行此代碼時,我都會在最后一行收到此錯誤:

OSError: exception: access violation writing 0x002CF330.

我真的不知道如何解決這個問題,因為這是C ++錯誤而不是Python錯誤。 我認為這與我的void指針有關,因為我在網上為C ++找到的類似錯誤與指針相關。 Ctypes void指針是否有問題,還是我做錯了?

您需要使用argtypes聲明所調用函數的參數類型。 由於我不知道您的確切API,因此下面是一個示例:

帶有回調的Windows C DLL代碼:

typedef void (*CB)(int a);

__declspec(dllexport) void do_callback(CB func)
{
    int i;
    for(i=0;i<10;++i)
        func(i);
}

Python代碼:

from ctypes import *

# You can use as a Python decorator.
@CFUNCTYPE(None,c_int)
def callback(a):
  print(a)

# Use CDLL for __cdecl calling convention...WinDLL for __stdcall.
do_callback = CDLL('test').do_callback
do_callback.restype = None
do_callback.argtypes = [CFUNCTYPE(None,c_int)]

do_callback(callback)

輸出:

0
1
2
3
4
5
6
7
8
9

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM