python调用dll三种方式

Java调用LTP接口(JNI方式实现) LTP编译使用译文提到了LTP自然语言处理平台的编译使用,设计C++、Python和Java方式,相信可以参见其在GitHub主页中提到的具体编译方式和使用。这里主要是关于在Java项目中调用C++。Java调用C++(编译得到DLL文件),主要用JNI和JNA,其中JNA是基于JNI的。LTP的Java移植版本ltp4j是采用JNI的方式。Java调用C++编译后的DLL文件,对于DL...... 阅读详情

很早就开始用cython方法,ctype方法,最近知道还有个pythonnet方法。分别说来。

1 cython包海康sdk

根目录先放inc和lib ,分别是厂商的.h文件和.so文件。然后根据头文件写cython的声明文件wrap.pyd:

# -*- coding: UTF-8 -*-
# -*- coding: UTF-8 -*-
# cdef extern from "string.h":
#     void* memcpy(void* dest, void* src,size_t count) except +
cdef extern from "HCNetSDK.h":
    ctypedef int BOOL
    ctypedef  unsigned int       DWORD
    ctypedef  unsigned short     WORD
    ctypedef  unsigned short     USHORT
    ctypedef  short              SHORT
    ctypedef  int                LONG
    ctypedef  unsigned char      BYTE
    ctypedef  unsigned int       UINT
    ctypedef  void*LPVOID
    ctypedef  void*HANDLE
    ctypedef  unsigned int*LPDWORD
    ctypedef  unsigned long long UINT64
    ctypedef  signed long long   INT64

    cdef enum:
        SERIALNO_LEN=48
        NAME_LEN=32
        MACADDR_LEN=6
        COMM_ALARM=0x1100  #8000报警信息主动上传
        MAX_DISKNUM=16#8000设备最大硬盘数
        MAX_CHANNUM=16#8000设备最大通道数
        MAX_ALARMOUT=4#8000设备最大报警输出数
    ctypedef struct NET_DVR_DEVICEINFO_V30:
        BYTE sSerialNumber[SERIALNO_LEN]
        BYTE byAlarmInPortNum
        BYTE byAlarmOutPortNum
        BYTE byDiskNum
        BYTE byDVRType
        BYTE byChanNum
        BYTE byStartChan
        BYTE byAudioChanNum
        BYTE byIPChanNum
        BYTE byZeroChanNum
        BYTE byMainProto
        BYTE bySubProto
        BYTE bySupport
        BYTE bySupport1
        BYTE bySupport2
        WORD wDevType
        BYTE bySupport3
        BYTE byMultiStreamProto
        BYTE byStartDChan
        BYTE byStartDTalkChan
        BYTE byHighDChanNum
        BYTE bySupport4
        BYTE byLanguageType
        BYTE byVoiceInChanNum
        BYTE byStartVoiceInChanNo
        BYTE  bySupport5
        BYTE  bySupport6
        BYTE  byMirrorChanNum
        WORD wStartMirrorChanNo
        BYTE bySupport7
        BYTE  byRes2
    ctypedef struct NET_DVR_SDKSTATE:
        DWORD dwTotalLoginNum
        DWORD dwTotalRealPlayNum
        DWORD dwTotalPlayBackNum
        DWORD dwTotalAlarmChanNum
        DWORD dwTotalFormatNum
        DWORD dwTotalFileSearchNum
        DWORD dwTotalLogSearchNum
        DWORD dwTotalSerialNum
        DWORD dwTotalUpgradeNum
        DWORD dwTotalVoiceComNum
        DWORD dwTotalBroadCastNum
        DWORD dwTotalListenNum
        DWORD dwEmailTestNum
        DWORD dwBackupNum
        DWORD dwTotalInquestUploadNum
        DWORD dwRes[6]
    ctypedef NET_DVR_DEVICEINFO_V30 *LPNET_DVR_DEVICEINFO_V30
    ctypedef NET_DVR_SDKSTATE *LPNET_DVR_SDKSTATE

    BOOL __stdcall NET_DVR_Init() except +
    BOOL __stdcall NET_DVR_Cleanup() except +
    BOOL __stdcall NET_DVR_SetConnectTime(DWORD dwWaitTime, DWORD dwTryTime) except +
    BOOL __stdcall NET_DVR_SetReconnect(DWORD dwInterval, BOOL bEnableRecon) except +
    DWORD __stdcall NET_DVR_GetLastError() except +

    LONG __stdcall NET_DVR_Login_V30(char *sDVRIP, WORD wDVRPort, char *sUserName, char *sPassword, LPNET_DVR_DEVICEINFO_V30 lpDeviceInfo) except +
    BOOL __stdcall NET_DVR_Logout_V30(LONG lUserID) except +
    BOOL __stdcall NET_DVR_Logout(LONG lUserID) except +
    BOOL NET_DVR_GetSDKState( LPNET_DVR_SDKSTATE pSDKState) except +



    ctypedef struct NET_DVR_ALARMER:
        BYTE byUserIDValid# userid是否有效 0-无效,1-有效 */
        BYTE bySerialValid# 序列号是否有效 0-无效,1-有效 */
        BYTE byVersionValid# 版本号是否有效 0-无效,1-有效 */
        BYTE byDeviceNameValid#  设备名字是否有效 0-无效,1-有效 */
        BYTE byMacAddrValid# MAC地址是否有效 0-无效,1-有效 */
        BYTE byLinkPortValid# login端口是否有效 0-无效,1-有效 */
        BYTE byDeviceIPValid# 设备IP是否有效 0-无效,1-有效 */
        BYTE bySocketIPValid# socket ip是否有效 0-无效,1-有效 */
        LONG lUserID#  NET_DVR_Login()返回值, 布防时有效 */
        BYTE sSerialNumber[SERIALNO_LEN]#  /* 序列号 */
        DWORD dwDeviceVersion# /* 版本信息 高16位表示主版本,低16位表示次版本*/
        char sDeviceName[NAME_LEN]#  /* 设备名字 */
        BYTE byMacAddr[MACADDR_LEN]#   /* MAC地址 */
        WORD wLinkPort#       link port */
        char sDeviceIP[128]#    /* IP地址 */
        char sSocketIP[128]# /* 报警主动上传时的socket IP地址 */
        BYTE byIpProtocol#    /* Ip协议 0-IPV4, 1-IPV6 */
        BYTE byRes1[2]
        BYTE bJSONBroken#   //JSON断网续传标志。0:不续传;1:续传
        WORD wSocketPort
        BYTE byRes2[6]
    ctypedef NET_DVR_ALARMER *LPNET_DVR_ALARMER


    ctypedef struct NET_DVR_ALARMINFO:
        DWORD dwAlarmType#/*0-信号量报警,1-硬盘满,2-信号丢失,3-移动侦测,4-硬盘未格式化,5-读写硬盘出错,6-遮挡报警,7-制式不匹配, 8-非法访问, 9-视频信号异常,10-录像异常 11- 智能场景变化*/
        DWORD dwAlarmInputNumber#/*报警输入端口*/
        DWORD dwAlarmOutputNumber[MAX_ALARMOUT]#/*触发的输出端口,哪一位为1表示对应哪一个输出*/
        DWORD dwAlarmRelateChannel[MAX_CHANNUM]#/*触发的录像通道,哪一位为1表示对应哪一路录像, dwAlarmRelateChannel[0]对应第1个通道*/
        DWORD dwChannel[MAX_CHANNUM]#/*dwAlarmType为2或3,6,9,10时,表示哪个通道,dwChannel[0]位对应第1个通道*/
        DWORD dwDiskNumber[MAX_DISKNUM]#/*dwAlarmType为1,4,5时,表示哪个硬盘, dwDiskNumber[0]位对应第1个硬盘*/
    ctypedef NET_DVR_ALARMINFO *LPNET_DVR_ALARMINFO

    ctypedef void (__stdcall *MSGCallBack)(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser)
    BOOL __stdcall NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, void* pUser)


    LONG __stdcall NET_DVR_StartListen_V30(char *sLocalIP, WORD wLocalPort, MSGCallBack DataCallback, void* pUserData)
    BOOL __stdcall NET_DVR_StopListen_V30(LONG lListenHandle)

自己设计到底用啥,写桥梁过度文件wrap.pyx:

cimport wrap
from libc.stdlib cimport malloc, free
from libc.string cimport memcpy
from cpython.pycapsule cimport *

# cdef object callbackfunc
# cdef void __stdcall MessageCallback(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser):
#     cdef wrap.NET_DVR_ALARMINFO struAlarmInfo
#     memcpy(&struAlarmInfo, pAlarmInfo, sizeof(wrap.NET_DVR_ALARMINFO))
#     altype=struAlarmInfo.dwAlarmType
#     chan=-1
#     for i in range(0,17):
#         if struAlarmInfo.dwChannel[i] == 1:
#             chan=i+1
#             break
#     # 使用request 发送到sever
#     global callbackfunc
#     (<object>callbackfunc)(lCommand,altype,chan)
#     return

cdef class Hc:
    cdef wrap.NET_DVR_DEVICEINFO_V30* struDeviceInfo
    cdef object callbackfunc # 这里不写,下面__init__要报错
    def __cinit__(self):
        self.struDeviceInfo = <wrap.NET_DVR_DEVICEINFO_V30*>malloc(sizeof(wrap.NET_DVR_DEVICEINFO_V30))
        if not self.struDeviceInfo:
            raise MemoryError
    def __dealloc__(self):
        free(self.struDeviceInfo)
    def notify(self,success,what):
        if success==1:
            print (what+"success")
        else:print (what+"fail")
        return
    def __init__(self):
        self.callbackfunc=""


    def dvr_init(self):
        success=wrap.NET_DVR_Init()
        self.notify(success,"init")
        return
    def set_con_time(self):
        success=wrap.NET_DVR_SetConnectTime(2000, 1)
        self.notify(success,"set con time")
        return
    def set_recon_time(self):
        success=wrap.NET_DVR_SetReconnect(10000, 1)
        self.notify(success,"reset time")
        return
    def get_error(self):
        error_code=wrap.NET_DVR_GetLastError()
        return error_code
    def login_v30(self,ip,port,user,pwd):
        userid=wrap.NET_DVR_Login_V30(ip,port,user,pwd,self.struDeviceInfo)
        if userid<0:
            error_code=self.get_error()
            print ("login fail,error code:",error_code)
            self.cleanup()
        print (self.struDeviceInfo.sSerialNumber)
        return userid
    def logout_v30(self,userid):
        success=wrap.NET_DVR_Logout_V30(userid)
        self.notify(success,"logout")
        return
    def logout(self,userid):
        success=wrap.NET_DVR_Logout(userid)
        self.notify(success,"logout")
        return
    # 函数内部分配内存,free
    cpdef get_version(self):
        cdef wrap.NET_DVR_SDKSTATE* psdkstate
        psdkstate=<wrap.NET_DVR_SDKSTATE*>malloc(sizeof(wrap.NET_DVR_SDKSTATE))
        if not psdkstate:
            raise MemoryError
        success=wrap.NET_DVR_GetSDKState(psdkstate)
        self.notify(success,"get version")
        print (psdkstate.dwTotalLoginNum)
        free(psdkstate)
        return
    def cleanup(self):
        success=wrap.NET_DVR_Cleanup()
        self.notify(success,"clean up")
        return
    def stop_listen(self,handler):
        status=wrap.NET_DVR_StopListen_V30(handler)
        return status

# 在set callback中把pyfunc创建来,让他等于self。callback,真正的c callback就是下面的中,运行pyfunc,达到运行时传入函数控制的目的


    cdef void __stdcall MessageCallback(self,LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser):
            cdef wrap.NET_DVR_ALARMINFO struAlarmInfo
            memcpy(&struAlarmInfo, pAlarmInfo, sizeof(wrap.NET_DVR_ALARMINFO))
            altype=struAlarmInfo.dwAlarmType
            chan=-1
            for i in range(0,17):
                if struAlarmInfo.dwChannel[i] == 1:
                    chan=i+1
                    break
            # 使用request 发送到sever
            (<object>self.callbackfunc)(lCommand,altype,chan)
            return


    cpdef set_callback_listen(self,pyfunc,port,lUserID):
        # global callbackfunc
        self.callbackfunc=pyfunc
        wrap.NET_DVR_SetDVRMessageCallBack_V30(<wrap.MSGCallBack>self.MessageCallback, NULL)
        lHandle = wrap.NET_DVR_StartListen_V30(NULL,port, <wrap.MSGCallBack>self.MessageCallback, NULL)
        if lHandle< 0:
            print ("NET_DVR_StartListen_V30 error code", self.get_error())
            self.logout(lUserID)
            self.cleanup()
        return

setup.py文件 python setup.py build_ext -i

# -*- coding: utf-8 -*-
from distutils.core import setup, Extension
from Cython.Build import cythonize
import os

hccom = list(map(lambda x: x[3:-3], os.listdir("./lib/HCNetSDKCom")))
libs=["hcnetsdk", "HCCore", "ssl", "crypto", ":libcrypto.so.1.0.0"] + hccom
print ("*********************************************************************")
print(libs)

setup(
    ext_modules=cythonize(
        Extension(
            'wrap',#mod name should be equal pyx file name,so the file will be entrance
            sources=['wrap.pyx'],
            language="c++",
            include_dirs=[os.path.abspath("./inc")],
            library_dirs=[os.path.abspath('.'), os.path.abspath("./lib"),os.path.abspath("./lib/HCNetSDKCom")],
            libraries=libs,
            extra_compile_args=[],
            extra_link_args=[]
        ),
        compiler_directives={'language_level': 3},
    )
)

# build_ext --inplace

# sources 里面可以包含 .pyx 文件,以及后面如果我们要调用 C/C++ 程序的话,还可以往里面加 .c / .cpp 文件
# language 其实默认就是 c,如果要用 C++,就改成 c++ 就好了
# include_dirs 这个就是传给 gcc 的 -I 参数
# library_dirs 这个就是传给 gcc 的 -L 参数
# libraries 这个就是传给 gcc 的 -l 参数
# extra_compile_args 就是传给 gcc 的额外的编译参数,比方说你可以传一个 -std=c++11
# extra_link_args 就是传给 gcc 的额外的链接参数(也就是生成动态链接库的时候用的)

# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib
# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./lib/HCNetSDKCom
# etc 下有一个ld的conf可以增加 ldconfig

最后是调用的例子

# -*- coding: utf-8 -*-
import os,sys

import wrap

alarms={0:"信号量报警",
        1:"硬盘满",
        2:'信号丢失',
        3:'移动侦测',
        4:'硬盘未格式化',
        5:'读写硬盘出错',
        6:'遮挡报警',
        7:'制式不匹配',
        8:'非法访问',
        9:'视频信号异常',
        10:'录像异常',
        11: '智能场景变化'}
def pyfunc(lCommand,altype,chan):
    print ("消息类型",lCommand)
    print ("alarm type",altype,alarms.get(altype,"not found"))
    print ("channel number",chan)
    return

hc=wrap.Hc()
hc.dvr_init()
hc.set_con_time()
hc.set_recon_time()
userid=hc.login_v30(b"192.168.2.102", 8000, b"admin", b"wangqi1977")
print ("userid",userid)
hc.get_version()
port=8087

hc.set_callback_listen(pyfunc,port,userid)
hc.logout(userid)
hc.cleanup()

2 ctype调用佳博打印机

这个简单很多,不过cython的好处在于可以自己设计api,把c的回调函数什么的调用设计更加pythonic

from ctypes import*
dll='./TSCLIB.dll'
TSCLIB_DLL= cdll.LoadLibrary(dll)
TSCLIB_DLL.openport("TSC TTP-245C")
# specified printer driver
TSCLIB_DLL.setup("100", "63.5", "4", "8", "0", "0", "0")
TSCLIB_DLL.clearbuffer()
TSCLIB_DLL.barcode("100", "100", "128", "100", "1", "0", "2", "2", "Barcode Test")
TSCLIB_DLL.printerfont("100", "250", "3", "0", "1", "1", "Print Font Test")
TSCLIB_DLL.windowsfont(100, 300, 24, 0, 0, 0, "ARIAL", "Windows Arial Font Test")

TSCLIB_DLL.downloadpcx("UL.PCX", "UL.PCX")
TSCLIB_DLL.sendcommand("PUTPCX 100,400,\"UL.PCX\"")
TSCLIB_DLL.printlabel("1", "1")
TSCLIB_DLL.closeport()

3 pythonnet

这个是有条件的,就是dll符合com接口,比如c#代码编译的出ClassLibrary1.dll:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace dllTest
{
    public class Operate
    {
        public int GetSum(int a, int b)
        {
            return a + b;
        }
    }
}


py调用

import clr  # pythonnet


# clr.FindAssembly('ClassLibrary1.dll')

clr.AddReference('ClassLibrary1')

from dllTest import Operate

s=Operate()
a=s.GetSum(12,3)
print (a)
将python文件打包成dll文件,并调用 Python有py、pyc、pyw、pyo、pyd等文件格式,其中除py其他格式起到了不暴露源码的作用,相当于c语言中的动态库 1.1生成单个pyc文件 对于py文件,可以执行下面命令来生成pyc文件,转化后的.pyc文件将在当前目录的__pycache__文件夹下. python -m compileall <dir> 另外一种方式是通过代码来生成pyc文件,同样转化后的.pyc文件将在当前目录的__pycache__文件夹下. importpy_compile . 阅读详情

相关推荐

Python调用dll文件、Python调用Matlab的.m文件

DLL:动态链接库,用来与其他语言进行交互。 多数情况下是带有.dll扩展名的文件,也可能是.ocx等,linux系统通常是.so文件。 1、vs创建项目 打开vs,新建win32项目, 点击完成。 2、vs已经生成相关文件, 现在需要在项目的cpp下面写dll文件: 比如,写一个加法运算 第5行,这条语句表示以c的格式导出一个lib文件,lib文件里包含了DLL中导出的相关信息 3、编译...

xue_csdn的博客 4161

python 调用dll总结

python 调用dll示例

Christo的博客 2900

Python调用DLL

环境: VS2010 + Python27 一. 创建一个dll DLL的创建过程参考: http://blog.youkuaiyun.com/cay22/article/details/5391319 1. 这里dll中导出函数是使用__stdcall声明的. 2. TestDll.dll中的两个导出函数 // TestDll.h #pragma once #ifd

cay22的专栏 3142

python调用dll文件

1、可以用四种方式调用: from ctypes import * #----------以下四种加载DLL方式皆可————————— # pDLL = WinDLL("test.dll") # pDll = windll.LoadLibrary("test.dll") # pDll = cdll.LoadLibrary("test.dll") pDll = CDLL("test.dll") 2、注意事项,调用32位的dll必须用32位python:conda 安装32位python。否则会报错:

叶子的博客 4512

Python如何调用DLL库?——实例详解及代码

Python如何调用DLL库?——实例详解及代码在Python中,您可以通过调用DLL库完成各种功能,来满足不同的需求。调用DLL库意味着从外部获取了一些函数,可以在Python中直接调用这些函数,这对于Python程序员来说是一种非常有用的技能。本文将为大家介绍如何在Python中调用DLL库。我们可以通过ctypes工具包访问动态链接库(DLL)。ctypes提供了与C语言兼容的数据类型,并支持用Python编写的Python模块的函数调用。

. 5508

使用Python引用DLL文件的方法

在某些情况下,您可能需要使用Python引用动态链接库(DLL)文件,以便在Python代码中调用DLL文件中的函数和方法。首先,您需要准备一个DLL文件,该文件包含您要在Python中调用的函数和方法。首先,您需要准备一个DLL文件,该文件包含您要在Python中调用的函数和方法。请将"your_function"替换为实际的函数名,并根据函数的返回类型和参数类型进行相应的更改。请将"your_function"替换为实际的函数名,并根据函数的返回类型和参数类型进行相应的更改。

BUG?不存在的! 4360

ironpython调用c dll_IronPython引用C#编写的Dll的几个方式

简单,不知者倒是可以看看,反正之前我纳闷挺久ironpython 引用c#编写自定义dll的几种写法1.当前运行目录import clrimport sysimport Systemsys.path.append(System.AppDomain.CurrentDomain.BaseDirectory)clr.AddReferenceToFile("abc.dll")2.绝对路径import cl...

weixin_39945178的博客 221

Python调用DLL文件

通过使用ctypes库,我们可以在Python中方便地调用DLL文件,扩展程序的功能。通过加载DLL文件并定义函数的原型,我们可以直接使用其中定义的函数和数据。通过调用DLL文件,我们可以使用其中定义的函数和数据,从而实现更多的功能和操作。ctypes是Python的标准库之一,它提供了与C语言兼容的数据类型和函数,使我们能够直接调用DLL文件中的函数。现在,我们可以通过调用DLL文件中的函数来实现我们想要的功能了。使用前面定义的函数原型,我们可以直接调用DLL中的函数。接下来,我们需要加载DLL文件。

PixelShadeZ的博客 1948

python调用c#注意事项_一 、C#调用Python的使用总结

由于项目的需要,需要通过C#调用Python文件(算法)。之前接触不多,在测试试验的过程遇到了挺多坑的,在这里将试验的过程和结果在这里总结一下。一.使用IronPython作为移植的依赖库,直接调用python文件的函数接口。百度词条:IronPython 是一种在 NET 和 Mono 上实现的 Python 语言,由 Jim Hugunin(同时也是 Jython 创造者)所创造。它的诞生是为...

weixin_39942726的博客 1031

C#实现调用python的三种方法(附完整源码)

C#实现调用python的三种方法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 3671

用电脑通过网口控制keysight示波器

Keysight HD304MSO示波器提供1GHz带宽、14位高精度ADC及10.1英寸触控屏,支持50μV低噪声信号捕获和1.3M波形/秒刷新率。配备4通道探头、逻辑分析仪接口及100Mpts存储深度,含故障诊断、FFT等高级功能。通过网线连接电脑安装TightVNC软件(示波器IP为169.254.163.24)可实现远程控制,相比U盘传输更高效。(149字)

johnboat的专栏 1136

python结合c_Python加C,岂不美哉

引言注意以下内容均为本人主观操作感受,运行环境为Win10+python3.7-32位,仅供本人日后查阅众所周知,python是一门优美而简洁的编程语言,其最大的不足在于运行速度过于感人,而C语言作为最接近底层的高级语言,速度快是他最大的优势。python被誉为胶水语言,应该有办法和C语言胶和起来,我查阅资料发现python调用C语言最普遍的方式大概有三种:1、将C语言的函数编译成dll动态链接库...

weixin_39892481的博客 672

livox avia平台搭建

livox雷达数据采集平台搭建

Shilong的博客 1310

python和c-python和C的如何实现互相调用?

本文和大家分享的是python和c的互相调用相关知识,一起来看看吧,希望对大家学习python有所帮助。最近在考虑基于udp做一个用于网游战斗中的数据同步协议,为了前期测试数据,决定先做一个外部的代理tunnel,原理是在server端和client端分别建立网络转发proxy,即原来的C/S连接改为两个proxy之间数据快速传输。因为udp库是用C++写的代码,在测试数据的时候需要不断地修改参数...

weixin_37988176的博客 116

数据分享|2023年OSM道路数据(全国,分省,分市)

首先这个工作非常有必要的,因为我们正常使用的道路的分类都是基于包括城市快速路、城市主干路、城市次干路这个体系的,大家对于这个分类体系应该更熟悉,但是OSM地图的道路分类又不是完全按这个来的,所以非常有必要重新分类;搞清楚道路类型是我们使用道路数据做很多工作的基础,比如我们在使用道路数据的时候,经常需要预估道路的行车速度,而这个速度一般就是根据道路类型来的,比如高架路的车速肯定就比城市支路快很多!下载分为两种情况,第一种是下载小区域的数据,比如下载一个街区的数据,第二种为下载整个中国范围的。

JData_Engineer的博客 4307

备赛电赛学习硬件篇(六):复位电路工作原理

上电复位的工作过程是在加电时,复位电路通过电 容加给RST端一个短暂的高电平信号,此高电平信号随着Vcc对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。在图2的复位电路中,当Vcc掉电时,必然会使RST端电压迅速下降到0V以下,但是,由于内部电路的限制作用,这个负电压将不会对器件产生损害。在上电或复位过程中,控制CPU的复位状态:这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。

m0_61022809的博客 6773

python 使用dll

1. python 用关键字 ctypes 来导入dll。 有三种导入dll的方式: cdll(): dll函数以c方式导出 windll(): dll 函数以标准方式导出 oledll(): com 方式导出 如: 1 from ctypes import *2 3 msvcrt = cdll.msvcrt 4 message_string = "hello ...

weixin_34367845的博客 165

WPF在特定领域的应用:打造一款专业的图像编辑工具

WPF在特定领域的应用:打造一款专业的图像编辑工具,在软件开发的广阔领域中,Windows Presentation Foundation(WPF)以其强大的图形渲染能力和丰富的用户界面控件,为开发者提供了构建高性能、美观应用程序的平台。图像编辑工具作为一种对图形处理要求极高的应用类型,WPF 的特性使其成为理想的选择。本文将深入探讨如何使用 WPF 打造一款专业的图像编辑工具,涵盖从基础概念到实际代码实现的各个方面。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 6万+

Python相关

Python: Python加载dll/so:http://blog.timd.cn/python-ctypes/

Vantler的博客 206

Diffusion models代码实战:从零搭建自己的扩散模型

这个系列曾经写过三篇文章专门讲代码,分别从数据集、超参数、loss设计、参数计算、Unet结构、正向过程、逆向过程等部分详细介绍了如何搭建DDPM。Diffusion models领域发展神速,最近半年代表作品有OpenAI的GLIDE、DALL-E 2,Google Brain的ImageGen,海森堡大学的Latent Diffusion。这篇博客针对入门新手讲解一下如何利用已有的资源快速搭建自己的Diffusion models。.........

沉迷单车的追风少年 1万+

RK平台以太网设置中添加代理设置

以太网中配置Configuration的时候可以IpConfiguration的初始化函数来设置代理类型和代理参数。通过添加一个KEY_ETH_PROXY的选项来设置代理的配置,然后再设置以太网静态或者动态的类型时候下发给系统进行设置。

Android系统开发笔记 657

对CANoe和VBA和TSmaster 三款工具的调用的理解

结论里每一行的“最小脚本要点”都可以直接 copy-paste 复现,前提就是表里最右列写明的硬件/驱动/license 条件——不满足就会报你之前贴过的那些真实错误码(0x8001/0x8004/XL_ERROR…在 Vector 硬件 + Vector driver 环境下成功 → CANoe / Vector 路径也 OK。所以我只是把 你已经跑通的三条代码路径 提炼成一张对照表,没有任何“吓唬”成分;实践是检验真理的唯一标准,你的实践已经替结论背过书了 👍。也能收发 → VBA 路径同样 OK。

weixin_44435894的博客 740

ADS基础教程24 - Gerber文件的导入

一、引言二、基本概念1.仿真文件下载2.仿真文件介绍二、导入步骤1.新建workspace2.选择Layout结构3.导入设计4.选择文件类型5.导入文件6.预览文件内容7.铜皮离散问题四、总结选择。通过本文章结束,可以了解ADS中如何将导入Gerber文件,并且对导入的铜皮进行合并。下一步就针对导入的文件进行层叠设置和编辑。END!}}END!

XZ_ZC的博客 3056

windows下python调用dll的方法

windows下python调用dll的方法VS生成dll可供python调用的dll生成python调用dll方法传入实数demo传入指针demo1传入指针demo2传入字符串demo传入字符串指针并返回字符串demo完整代码 VS生成dll 关于VS生成dll文件供另一个C++程序调用的方法请参考我的这篇blog: VS生成动态链接库dll的方法 可供python调用的dll生成 在生成dll...

wolfcsharp的博客 2万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

将Python文件发布成DLL并调用

如何将Python文件发布成DLL供C/C++调用,试过两种思路: 一种是用Cython将Python文件转为.c文件,但是简简单单4行代码,生成.c文件有5000+行,而且完全找不到原python函数的入口,无奈放弃; 另一种思路是用CPython API给原Python函数写一个C/C++接口调用原函数,再打包成DLL,也是这篇文章的主要内容。 先讲一下我使用的环境: Python Interpreter: Anaconda3 Python 3.8.5 Python Library: Nump

zsh19980724的博客 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

将python程序打包成DLL的三种方式

将python程序打包成DLL的三种方式

weixin_43931979的博客 3014

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 从tcp到http
下一篇: 海康安防平台api的python调用两种方式
wangmarkqi
博客等级 码龄12年 25粉丝 47原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值