wafer_lu 发表于 2014-08-22 10:01

python调用dll出错

------**求教各路大神!!!**------
Python调用用C++写的dll,这个dll有调用另一个dll,设为B.dll,这个B.dll中封装了
C#,结果在运行python时出现错误:
【OSError: Windows Error 0x%X】

python代码如下:import ctypes, os
from ctypes import *

CUR_PATH = os.path.dirname(__file__)
devGenDll = ctypes.WinDLL(os.path.join(CUR_PATH, "RF_MES.dll"))
devGenDll.InitWS(ctypes.c_char_p(b'www.xxxx.nett'))
deviceID = devGenDll.GetDeviceID("11", "7")

print(deviceID)RF_MES.dll中主要代码如下:#include "stdafx.h"
#include "WSDataTransCpp.h"
#include <stdlib.h>
#include <stdio.h>

#define SUCCESS                1

extern "C"{

CWSDataTransCpp* wsDataTrans;

__declspec(dllexport)void __stdcall InitWS(char* serverIP)
{
        printf("InitWS");
        wsDataTrans = new CWSDataTransCpp(serverIP);
       
}

__declspec(dllexport)char* __stdcall GetDeviceID(char* lineNo, char* stationNo)
{
        if(wsDataTrans && wsDataTrans->ConnectCheck())
                return wsDataTrans->ObtainDeviceID(lineNo, stationNo);
        //printf("GetDeviceID");
        return NULL;
}

__declspec(dllexport)int __stdcall UploadResult(char* lineNo, char* stationNo, char* deviceID, char* result)
{
        return SUCCESS;
}
}

wafer_lu 发表于 2014-08-22 10:16

在线等啊!!求赐教!

icymirror 发表于 2014-08-22 10:37

回复 1# wafer_lu
(-532462766)dec=(E0434352)hex,查Windows错误代码可以知道,这个应当是.NET的问题。
建议你先看下你的C++调用C#的结果是不是正常吧。
这个应当和python没有关系。

wafer_lu 发表于 2014-08-25 11:14

本帖最后由 wafer_lu 于 2014-08-25 11:14 编辑

icymirror 发表于 2014-08-22 10:37 static/image/common/back.gif
回复 1# wafer_lu
(-532462766)dec=(E0434352)hex,查Windows错误代码可以知道,这个应当是.NET的问题。
...

我用c写个应用调用这个dll没问题,在python上就有问题。
不知道是不是python调用封装C#的dll有什么特别的地方没?

icymirror 发表于 2014-08-25 19:58

有个问题,刚刚发现,你是在用ctypes,这个是和native library交互的。
也就是说:使用这个,python调用c接口没有问题,但是.net的dll不是ctypes可以交互的library。这可能是问题所在。
你试下在python里面有没有可能直接调用你的c的库文件。应当是可以的。
(因为.NET的二进制是给.net的平台用的二进制格式,不是那种传统的c的cll,应当是这里的格式问题。)

icymirror 发表于 2014-08-25 21:06

或者,你也可以通过使用IronPython来调用C#的Library(.dll)文件。

wafer_lu 发表于 2014-08-27 11:41

回复 6# icymirror


IronPython 直接调用C# 的dll?

但我的调用关系是这样的:python->A.dll(c++)->B.dll(C++)->C.dll(C#)

B和C都是第三方的。A是我自己封装的。

运行python脚本时会提示无法加载组件C.dll。

wafer_lu 发表于 2014-08-27 16:27

问题终于解决了。。。
需要把C.dll放到python.exe的目录下(不是脚本目录)才能运行成功。

谢谢 @icymirror 的回复。
页: [1]
查看完整版本: python调用dll出错