1. 程式人生 > >vs2010編寫dll庫供python使用

vs2010編寫dll庫供python使用

剛接觸這個問題的時候在網上也是蒐羅了一大堆,大多數做下來沒有成功,原因未知,很可能是我的功底不夠吧,這裡記錄一下我成功的demo,希望能版主其他人。

首先就是使用vs2010建立一個dll庫(空專案)的工程,
新增原始檔(如:hello.cpp)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define EXPORT_PKG_DLL
#include "hello.h"

PKG_API int GetStructInfo(struct StructInfo* pStruct)
{
    pStruct->
soh = 0x55; pStruct->id = 0x1234; pStruct->cmd = 0x56; pStruct->len = 0x9; strncpy(pStruct->data,'hello',5); pStruct->crc = 0x90f2; return TURE; }

定義hello.h檔案:

#ifdef EXPORT_PKG_DLL  
#define PKG_API __declspec(dllexport)  
#else  
#define PKG_API __declspec(dllimport)  
#endif #define PKG_SOH 0x55 #define TURE 0 #define FALSE 1 #define DATA_LEN 256 struct StructInfo { int soh; int id; int cmd; int len; char data[DATA_LEN]; int crc; }; extern "C" { PKG_API int GetStructInfo(const char *src,struct StructInfo* pStruct); }

然後編譯生成*.dll檔案,(rg:pycall.dll)

接下來就是編寫py程式:

from ctypes import *

DEST_LEN = 270
DATA_LEN = 256
#define type
DESTARRAY270 = c_char * DEST_LEN;#int []
CHARARRAY256 = c_char * DATA_LEN;#char []
#define struct c_char_p: *  c_int :int

class StructPkg(Structure):
    _fields_ = [
        ("soh", c_int),
        ("id", c_int),
        ("cmd", c_int),
        ("len", c_int),
        ("data", CHARARRAY256),
        ("crc", c_int),
               ]


dll = cdll.LoadLibrary('pycall.dll');
GetStructInfo = dll.GetStructInfo;
#set the return type
GetStructInfo.restype = c_int;
#set the argtypes
GetStructInfo.argtypes = [c_char_p,POINTER(StructPkg)];

objectStruct = StructPkg()
#invoke api GetStructInfo
test = bytes([85,1,2,1,12])
teststr = 'get data cmd'
testcrc = bytes([0x71,0x79])
ll = test+teststr.encode('utf-8')+testcrc

retStr = GetStructInfo(ll,byref(objectStruct));
print(objectStruct)
# #check result
print ("soh: ", objectStruct.soh)
print ("id: ", objectStruct.id)
print ("cmd: ", objectStruct.cmd)
print ("len: ", objectStruct.len)
print ("data: ", objectStruct.data)
print ("crc: ", objectStruct.crc)
print (retStr);

結果如下:(程式很簡單這裡不做太多的說明)

這裡寫圖片描述

相關推薦

vs2010編寫dllpython使用

剛接觸這個問題的時候在網上也是蒐羅了一大堆,大多數做下來沒有成功,原因未知,很可能是我的功底不夠吧,這裡記錄一下我成功的demo,希望能版主其他人。 首先就是使用vs2010建立一個dll庫(空專案)的工程, 新增原始檔(如:hello.cpp) #i

VS2010編寫動態連結DLL及單元測試用例

本文將建立一個簡單的動態連結庫,並編寫一個控制臺應用程式使用該動態連結庫,該動態連結庫為“JAVA呼叫動態連結庫DLL之JNative學習”中使用的DLL,只是專案及檔名稱不同。 建立動態連結庫專案:1、開啟Microsoft Visual Studio 2010,選

VS2010編寫動態和呼叫動態

https://www.cnblogs.com/zhengfa-af/p/8108187.html https://blog.csdn.net/qq_22642239/article/details/80451299 VS2010 中編寫動態庫和呼叫動態庫 百度查了一下在VS中編寫動態庫

ApolloStudio高手之路(8):用Python呼叫.Net(C#、VB.Net等)開發的動態連結DLL檔案)實現相互協作

ApolloStudio是基於.Net與Python雙架構下的實現,這樣的架構體系使得其具有傳統定製軟體無法比擬的超強拓展性,在本文中我們將介紹這兩者是如何在ApolloStudio平臺上實現優勢互補的。由於在ApolloStudio中使用的更易學習的Python作為主導指令碼語言,這裡我們將介

C++編寫動態.so或者.dll的陷阱

一、介面不變就可以不需要重新編譯? 對於很多庫的實現者可能會有這樣的認識“介面不變就可以不需要重新編譯”,其實這句話是有前提的,前提是實現的動態庫有足夠的相容性和魯棒性。尤其是C++實現的動態庫,C++只對語言層規則做了規定,沒有二進位制級別的任何規定。 COM本質論裡面的

使用VS2010編寫Python的C擴充套件

        Python語言的特性具有良好的開發效率,使其在諸多領域備受青睞。然而Python語言執行效率的缺陷,使得他在許多對工程效率要求嚴格的領域的應用受到了限制。但好在Python具有優秀的擴充套件效能(常常被人稱作膠水語言),能通過C\C++、Java等多種語言

如何使用C/C++為Python編寫DLL/SO

開門見山,直接闡述步驟。 1. 新建一個原始碼檔案,裡面包含了返回兩個整數的和的函式 如果使用C語言,新建test.c檔案,並輸入以下內容: // test.c __declspec(dll

怎樣用VB編寫.DLL動態連結檔案

一、名詞解釋:DLL 的學名叫 動態連結庫二、它是幹什麼用的:搜尋一下有很完整詳細的解釋。這裡,我只引用過來當中的一句話“在Windows中,許多應用程式並不是一個完整的可執行檔案,它們被分割成一些相對獨立的動態連結庫,即DLL檔案,放置於系統中。當我們執行某一個程式時,相應

c#編寫dll 其他語言呼叫問題

前段時間一個停車場監控的專案中,公司需要在vb 的程式集呼叫一個外部dll,於是編寫了一個dameo 介入後發現無法呼叫,後來查閱資料發現c#的dll不是變準dll,是基於程式集託管(基於.net framework)的的程式碼,而其他語言 比如c是非程式及託管的dll

OWIN 自宿主模式WebApi項目,WebApi層作為單獨類OWIN調用

編寫 [] tolower del 移動互聯網 sat con list() owin OWIN是Open Web Server Interface for .NET的首字母縮寫,他的定義如下: OWIN在.NET Web Servers與Web Application之間

c# 使用ZXing.dll生成二維碼

下載地址 style 工具 wid apach 點擊下載 bitmatrix 寬度 nbsp 最近工作中有需要一個需求,就是把一個服務地址生成二維碼,可以用來掃碼分享,網上找了下方法也比較多,我這裏po一下調用ZXing.dll庫生成二維碼的方法吧。先簡單介紹一下 ZXin

vs2010生成Dll文件並引用dll(C#)

封裝 成了 編寫 comm 方案 控制臺 out div wot 1、創建新C#控制臺應用程序,項目命名createBll,打開Program.cs重命名為TestA(可以不重命名)並修改代碼,如圖: 寫好後,可以寫其它的類.cs文件 2、完成後,點擊菜單欄的“項目”,下

安裝第三方出現 Python version 2.7 required, which was not found in the registry

prefix another odin light admin urn utf n! .py 安裝第三方庫出現 Python version 2.7 required, which was not found in the registry 建立一個文件 register.

VS編譯後直接復制DLL文件到其他目錄下

back -h none api ont qq截圖 dir 編譯 dll 項目目錄:SourceCode\公共組件\KApiClient\ 要復制的目的目錄: SourceCode\公共組件\DllLibrary\ApiClient 則在項目 KApiClient下添加

day-9 sklearnpython自帶實現最近鄰KNN算法

-m 寬度 ont 產生 res 長度 比較 target 1.2   K最近鄰(k-Nearest Neighbor,KNN)分類算法,是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。該方法的思路是:如果一個樣本在特征空間中的k個最相似(即特征空間中最鄰近)

回顧一下C++ 編寫DLL

short 導出函數 article details depends 開始 工程 https -i 項目模版使用Win32工程創建的dll項目 一、原始代碼 使用depends查看導出函數 二、不同編譯方式區別 C方式編譯(extern "C"): __std

建立一個C++製作的包含Opencv功能的dllC#程式使用

目的:朋友用C#編寫了一個軟體,先需要一個功能:獲取某圖片指定位置的顏色。 實現該目的的方法有很多,即為了朋友能夠很便捷解決該問題,也為了有助於擴充自己技術廣度,所以決定採用標題中的方法來完成。   沒有C++程式設計經驗,也沒有製作C++版Opencv語法經驗,也沒有製作dll的經驗,整個流

創建一個C++制作的包含Opencv功能的dllC#程序使用

VS2017 應該 新建 3.4 ont 位置 size 圖片 能夠 目的:朋友用C#編寫了一個軟件,先需要一個功能:獲取某圖片指定位置的顏色。 實現該目的的方法有很多,即為了朋友能夠很便捷解決該問題,也為了有助於擴充自己技術廣度,所以決定采用標題中的方法來完成。 沒有

Urllibpython內建的http請求

1、四個模組: request error parse robotparser 2、urlopen(url, data, timeout) 傳送請求 get請求無data; post請求有data 3、read() 獲取響應體的內容 4、Handl

Python必學原始碼Python的錯誤處理方法!

在程式執行的過程中,如果發生了錯誤,可以事先約定返回一個錯誤程式碼,這樣,就可以知道是否有錯,以及出錯的原因。在作業系統提供的呼叫中,返回錯誤碼非常常見。比如開啟檔案的函式open(),成功時返回檔案描述符(就是一個整數),出錯時返回-1。 用錯誤碼來表示是否出錯十分不便,因為函式本身應該返回的正