1. 程式人生 > >python呼叫dll動態庫傳入結構體作為引數

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,