python呼叫dll動態庫傳入結構體作為引數
test.h中定義結構體
test.h
#include <stdio.h>
#include <wchar.h>
#define ARRAY_NUMBER 20
#define STR_LEN 20
typedef struct _tag_Struct
{
int number;
char* pChar; //窄字元字串
char str[STR_LEN]; //窄字元陣列
int iArray[ARRAY_NUMBER];
}TMPSTRUCT;
extern "C"
{
__declspec(dllexport) int __cdecl test(wchar_t* a, int len);
__declspec(dllexport) TMPSTRUCT* __cdecl testStruct(TMPSTRUCT* a, int len);
};
test.cpp
#include "test.h"
__declspec(dllexport) int __cdecl test(wchar_t* a, int len)
{
printf("get [%S] len %d\r\n", a, len);
printf("hell test %s line %d \r\n", __FUNCTION__, __LINE__);
return 169;
}
__declspec(dllexport) TMPSTRUCT* __cdecl testStruct(TMPSTRUCT* a, int len)
{
int i = 0;
printf("num %d str %s \r\n", a->number, a->pChar);
for (i = 0; i < ARRAY_NUMBER; ++i)
{
printf("%d ", a->iArray[i]);
}
printf("\r\n");
for (i = 0; i < STR_LEN; ++i)
{
printf("[%x %c] ", a->str[i], a->str[i]);
}
printf("\r\n");
return a;
}
test.py
#coding=utf-8
from ctypes import *
import struct
import binascii
slen = 4
sBuf = 'aaaaaaaaaabbbbbbbbbbbbbb'
adll = cdll.LoadLibrary( 'pydll.dll' )
##傳入的引數是寬字元
adll.test(sBuf, slen);
ARRAY_NUMBER = 20;
STR_LEN = 20;
#define type
INTARRAY20 = c_int * ARRAY_NUMBER;
CHARARRAY20 = c_byte * STR_LEN;##不會給c_char*STR_LEN賦值,所以找了一個同樣大小的型別
#define struct
class StructTest(Structure):
_fields_ = [
("number", c_int),
("pChar", c_wchar_p),
("str", CHARARRAY20),
("iArray", INTARRAY20)
]
#load dll and get the function object
dll = cdll.LoadLibrary('pydll.dll');
testStruct = dll.testStruct;
objectStruct = StructTest();
objectStruct.number = 1989;
objectStruct.pChar = c_wchar_p('today is a very beautify day');
print ("before set value");
print ("get %d pChar %s"%(objectStruct.number, objectStruct.pChar));
print (sizeof(objectStruct.str));
print (len(objectStruct.str));##如果不是c_byte而是c_char這裡的len的返回值是0,
print (len(objectStruct.iArray));
for i in range(0, len(objectStruct.str)):
objectStruct.str[i] = 65 + i;
print ("str value done");
for i in range(0, len(objectStruct.iArray)):
objectStruct.iArray[i] = i + 2;
#invoke api GetStructInfo
retStr = testStruct(pointer(objectStruct), 12);
#check result
print (objectStruct.number);
print (objectStruct.pChar);
for i,val in enumerate(objectStruct.iArray):
print (val);
input("press enter to quit")
相關推薦
python呼叫dll動態庫傳入結構體作為引數
test.h中定義結構體 test.h #include <stdio.h> #include <wchar.h> #define ARRAY_NUMBER 20 #define STR_LEN 20 typedef struct _tag_Str
如何使用Python呼叫dll動態連結庫?
1. 需求 最近有這樣一個需求:網路上下載了大佬的深度學習影象識別模型,想要整合到自己的後端作為服務呼叫。 模型是.dll檔案,而我這邊使用的是Python。 2. 思路 .dll是使用C或者C++編譯的動態連結庫,一般留有函式入口可以進行呼叫。 首先我們通過閱讀原專案的原始
python呼叫.net動態庫
# python呼叫.net動態庫 ### pythonnet簡介------------------------------ pythonnet是cpython的擴充套件- pythonnet提供了cpython和.net程式集之間互動的橋樑- pythonnet開源在github上 ### pytho
python呼叫第三方動態庫(附程式碼)
摘要 本文講述python混合程式設計之呼叫動態庫 引言 python因為良好的編碼性和擴充套件庫正被大規模的使用,但他有兩個缺點:1、程式碼可見;2、執行效率低,於是在實際應用中經常會把高效和核心程式碼用C/C++實現,業務部分用python實現。這就需要進行混合程式設計,
關於java用jni呼叫 dll動態庫Can't find dependent libraries錯誤的解決
最近在做一些java開發的時候,需要呼叫作業系統底層的一些東西,所以我用c++ 寫了一個dll動態庫檔案,通過java的JNI進行呼叫。dll 檔案生成之後 在本機用java呼叫沒有問題, 但是換了一臺主機就報錯了,報錯如下: java.lang.UnsatisfiedLinkError: D:\wo
JNA方式呼叫dll動態庫
java呼叫dll較為常用的方式有JNA和JNI。 JNA是建立在JNI技術基礎之上的一個Java類庫,我們可以方便地使用java直接訪問動態連結庫中的函式。 原來使用JNI,必須手工用C寫一個動態連結庫,在C語言中對映Java的資料型別。 而JNA提供了一個動態的C
python呼叫C動態庫匯出函式的返回值為指標型別時,在64位python環境下被截斷解決方法
class my_void_p(c_void_p): pass def sslog_create_instance(): #直接指定 restype=c_void_p在64位上還是會發生地址截
linux下python呼叫C++動態庫以及庫函式
C++:首先C++需要編譯成動態共享庫C++程式碼(cpptest.cpp)如下------#include<iostream>using namespace std;extern "C"{//在extern “C”中的函式才能被外部呼叫int test(){
python 呼叫C++動態庫所遇到的undefined symbol ***
因為演算法效率問題所以要在python中呼叫C, 先寫一個C函式: test.cpp # include<stdio.h> # include <stdlib.h> //atoi # include <stri
swift 類 結構體 作為引數 以及可變引數
Class class Person{ var age = 22, name = "frank" func growolder() { self.age++ //++ 要跟住 不要亂打空格 // 如
C語言結構體內含有陣列,該結構體作為引數傳遞時需用指標,否則對陣列的修改不會被記錄
在C語言程式設計時,常常會定義結構體,而且結構體裡面常常會有陣列,比如如下所示: typedef struct {int data[MAX_HEAP_SIZE];unsigned int heap_size;}HeapType; 這是一個堆的資料結構,包含堆
Delphi 呼叫 c編寫的動態連結庫,結構體指標作為引數
折騰了一天終於把 結構體指標作為在delphi和c動態連結庫之間函式引數傳遞的問題徹底解決了,花了一天時間的主要原因是沒有領會引數傳遞的精髓。現在把c程式碼和delphi程式碼粘上來,以供後來者學習參考。 delphi程式程式碼: unit Unit3; interfac
使用Java的JNative呼叫dll動態連結庫
1,首先下載JNative的庫,其中包含JNative.jar, JNativeCpp.dll, libJNativeCpp.so這三個包。 JNative.jar是需要匯入到Java工程的lib下。 通過Build Path即可匯入
c++ 呼叫Python指令碼或者動態庫——環境Ubuntu 16.04下用codeblocks
背景:因為使用的是python版本的程式,最終要整合到C++環境的架構中,也就是說架構是c++的,交付使用者為c++的介面,但是呼叫的是python的庫,因此需要學習在c++環境下呼叫python。因為對python不熟悉,可以說有點一抹黑,因此從簡到難逐步探索。首先在c++
DLL動態庫巢狀跨級呼叫問題
在應用過程中,動態庫呼叫動態庫是常見操作。其在理論上可行,實施也相對簡單,呼叫層次關係如下: App主程式---(同目錄)--->DLL_A------(同目錄)----->DLL_B&DLL_C 圖1 呼叫層次關係 針對圖1所示的應用,應對的方法如
VS2013 c++ 生成和呼叫DLL動態連結庫
在專案方案目錄裡,Debug資料夾中可以找到DLLGenerator.lib 和 DLLGenerator.dll, 把這兩個檔案和工程的標頭檔案(dllgenerator.h)移動到一個空資料夾(E:\dlltest\DLL)中,以後你的專案用到此dll就包含這個目錄,至此動態庫建立完畢。
JNA呼叫C動態庫dll、so
1.介紹jna JNA(Java Native Access )提供一組Java工具類用於在執行期動態訪問系統本地庫(native library:如Window的dll)而不需要編寫任何Native/JNI程式碼。開發人員只要在一個java介面中描述目
Codeblocks建立和呼叫DLL動態連結庫(C語言)
建立一個最簡單的只有一個get_id() 函式的DLL庫 一、建立C語言動態連結庫 1.新建一個動態庫的工程 File - New - Project - DLL - Go 新建的工程原來的main.cpp和main.h刪除,新建兩個檔案simple.h, simple
windows系統下可執行程式呼叫lib靜態庫和dll動態庫的方法
#include <stdio.h> #include <Windows.h> int main() { HINSTANCE h=LoadLibraryA("newdll.dll"); typedef int (* FunPtr)(int a,int b);//定義函
利用c#實現dll動態庫,並在c++中呼叫的方法
近期,在進行一個大專案開發。其中涉及多語言協同開發。主要是c#dll和c++dll的開發和應用,其中,需要在c++中呼叫c#dll的內容。現在把開發中的經驗、教訓和注意事項總結整理如下,希望對其他人能有所幫助。 1.建立c#dll,