亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python ctypes cdll.LoadLibrary,實例化一個對象,執行其方法

Python ctypes cdll.LoadLibrary,實例化一個對象,執行其方法

呼喚遠方 2019-09-06 16:06:22
我在c中編寫了一個dll庫,使用vs2017 64位編譯,并嘗試使用64位python3.6加載它。但是,對象的成員變量的地址被截斷為32位。這是我的sim.c文件,它被編譯為sim.dll:class Detector {public:    Detector();    void process(int* pin, int* pout, int n);private:    int member_var;};Detector::Detector(){    memset(&member_var, 0, sizeof(member_var));    myfile.open("addr_debug.txt");    myfile << "member_var init address: " << &member_var << endl;}void Detector::process(int* pin, int* pout, int n);{    myfile << "member_var process address: " << &member_var << endl;    myfile.close();}#define DllExport   __declspec( dllexport )  extern "C" {    DllExport Detector* Detector_new() { return new Detector(); }    DllExport void Detector_process(Detector* det, int* pin, int* pout, int n)    {        det->process(pin, pout, n);    }}這是我的python腳本:from ctypes import cdlllib = cdll.LoadLibrary(r'sim.dll')class Detector(object):    def __init__(self):        self.obj = lib.Detector_new()    def process(self,pin, pout, n):        lib.Detector_process(self.obj,pin, pout, n)detector = Detector()n = 1024a = np.arange(n, dtype=np.uint32)b = np.zeros(n, dtype=np.int32)aptr = a.ctypes.data_as(ctypes.POINTER(ctypes.c_int))bptr = b.ctypes.data_as(ctypes.POINTER(ctypes.c_int))detector.process(aptr, bptr, n)這是addr_debug.txt中member_var的地址:member_var init address:    0000025259E123C4member_var process address: 0000000059E123C4因此訪問它會觸發內存訪問錯誤:OSError: exception: access violation reading 0000000059E123C4我試圖了解這個問題的一些嘗試:將member_var定義為public而不是private,而不是幫助,地址仍然被截斷。將member_var定義為全局變量,然后地址就可以了。所以我猜想在將對象返回到python或將對象傳遞回dll時會發生member_var地址截斷。
查看完整描述

2 回答

?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

從你那里學到了很多東西。所以問題是Detector對象地址被截斷為默認的int,因為我沒有指定函數返回類型。由于成員變量的地址是相對于對象的基址,當將錯誤的對象基地址傳遞給DetectorProcess函數時,包含所有成員變量的該對象的每個相對地址都會混亂。令我感到驚訝的是,即使pDet指針錯誤,也可以執行“pDet-> process()”函數。

查看完整回答
反對 回復 2019-09-06
  • 2 回答
  • 0 關注
  • 5984 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號