免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5261 | 回复: 7
打印 上一主题 下一主题

python调用dll出错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-22 10:01 |只看该作者 |倒序浏览
------**求教各路大神!!!**------
Python调用用C++写的dll,这个dll有调用另一个dll,设为B.dll,这个B.dll中封装了
C#,结果在运行python时出现错误:
【OSError: [WinError -532462766] Windows Error 0x%X】

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

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

  7. print(deviceID)
复制代码
RF_MES.dll中主要代码如下:
  1. #include "stdafx.h"
  2. #include "WSDataTransCpp.h"
  3. #include <stdlib.h>
  4. #include <stdio.h>

  5. #define SUCCESS                1

  6. extern "C"{

  7. CWSDataTransCpp* wsDataTrans;

  8. __declspec(dllexport)  void __stdcall InitWS(char* serverIP)
  9. {
  10.         printf("InitWS");
  11.         wsDataTrans = new CWSDataTransCpp(serverIP);
  12.        
  13. }

  14. __declspec(dllexport)  char* __stdcall GetDeviceID(char* lineNo, char* stationNo)
  15. {
  16.         if(wsDataTrans && wsDataTrans->ConnectCheck())
  17.                 return wsDataTrans->ObtainDeviceID(lineNo, stationNo);
  18.         //printf("GetDeviceID");
  19.         return NULL;
  20. }

  21. __declspec(dllexport)  int __stdcall UploadResult(char* lineNo, char* stationNo, char* deviceID, char* result)
  22. {
  23.         return SUCCESS;
  24. }
  25. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2014-08-22 10:16 |只看该作者
在线等啊!!求赐教!

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
3 [报告]
发表于 2014-08-22 10:37 |只看该作者
回复 1# wafer_lu
(-532462766)dec=(E0434352)hex,查Windows错误代码可以知道,这个应当是.NET的问题。
建议你先看下你的C++调用C#的结果是不是正常吧。
这个应当和python没有关系。

论坛徽章:
0
4 [报告]
发表于 2014-08-25 11:14 |只看该作者
本帖最后由 wafer_lu 于 2014-08-25 11:14 编辑
icymirror 发表于 2014-08-22 10:37
回复 1# wafer_lu
(-532462766)dec=(E0434352)hex,查Windows错误代码可以知道,这个应当是.NET的问题。
...


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

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
5 [报告]
发表于 2014-08-25 19:58 |只看该作者
有个问题,刚刚发现,你是在用ctypes,这个是和native library交互的。
也就是说:使用这个,python调用c接口没有问题,但是.net的dll不是ctypes可以交互的library。这可能是问题所在。
你试下在python里面有没有可能直接调用你的c的库文件。应当是可以的。
(因为.NET的二进制是给.net的平台用的二进制格式,不是那种传统的c的cll,应当是这里的格式问题。)

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
6 [报告]
发表于 2014-08-25 21:06 |只看该作者
或者,你也可以通过使用IronPython来调用C#的Library(.dll)文件。

论坛徽章:
0
7 [报告]
发表于 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。

论坛徽章:
0
8 [报告]
发表于 2014-08-27 16:27 |只看该作者
问题终于解决了。。。
需要把C.dll放到python.exe的目录下(不是脚本目录)才能运行成功。

谢谢 @icymirror 的回复。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP