免费注册 查看新帖 |

Chinaunix

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

请问如何调用.dll文件中的类 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-16 18:08 |只看该作者 |倒序浏览

  1. 00105 class CSgip;
  2. 00106
  3. 00110 class CJobSgip : public IJobDesc {
  4. 00111 public:
  5. 00112         CJobSgip(SOCKET &hSocket, CSgip* sgip, unsigned remoteport);
  6. 00113         CJobSgip(sgipg_submit pss, CSgip* sgip, unsigned int nSeq, unsigned int nDateTime);
  7. 00114         ~CJobSgip();
  8. 00115
  9. 00116         void    RecvMOProc();
  10. 00117         void    SendMTProc();
  11. 00118         int             nType;
  12. 00119
  13. 00120 private:
  14. 00121         sgip_conn                       sp_conn;
  15. 00122         CSgip*                          m_sgip;
  16. 00123         sgipg_submit    ss;
  17. 00124         unsigned                        m_nSeq;
  18. 00125         unsigned                        m_nDateTime;
  19. 00126 };
  20. 00127
  21. 00131 class CWorkerSgip : public IWorker {
  22. 00132         virtual void ProcessJob( IJobDesc* pJobDesc );
  23. 00133 };
  24. 00134
  25. 00138 class ConnInfo {
  26. 00139 public:
  27. 00140         ConnInfo() {
  28. 00141                 socketHandle    = 0;
  29. 00142                 port                                    = 0;
  30. 00143                 connectedTime = _T("");
  31. 00144         }
  32. 00145
  33. 00146         ConnInfo(
  34. 00147                 unsigned        _socketHandle,
  35. 00148                 unsigned        _port,
  36. 00149                 CString         _connectedTime
  37. 00150                 ) {
  38. 00151                         socketHandle    = _socketHandle;
  39. 00152                         port                                    = _port;
  40. 00153                         connectedTime = _connectedTime;
  41. 00154                 }
  42. 00155
  43. 00156                 unsigned        socketHandle;           
  44. 00157                 unsigned        port;                                          
  45. 00158                 CString         connectedTime;  
  46. 00159 };
  47. 00160
  48. 00161 typedef std::list<ConnInfo>             cList;
  49. 00162
  50. 00166 class SGIP_API CSgip{
  51. 00167         friend class CJobSgip;
  52. 00168 public:
  53. 00169
  54. 00173         CSgip();
  55. 00174
  56. 00178         ~CSgip();
  57. 00179
  58. 00215         int Start(
  59. 00216                 char                    *sLocalIP,
  60. 00217                 int                             nLocalPort,
  61. 00218                 char                    *sPeerIP,
  62. 00219                 int                             nPeerPort,
  63. 00220                 char                    *sLoginName,
  64. 00221                 char                    *sLoginPwd,
  65. 00222                 int                             nConnType,
  66. 00223                 char                    *sSrcNum,
  67. 00224                 int                             (*OnDeliver)(DeliverStr  deliver),
  68. 00225                 int                             (*OnReport)(ReportStr report),
  69. 00226                 int                             (*OnResponse)(MTRespStr  response),
  70. 00227                 int                             (*OnMTError)(MTErrorStr mterror),
  71. 00228                 int                             nConnCount = 3,
  72. 00229                 bool                    fOutputDebugInfo = false,
  73. 00230                 char                    *sPeerName = NULL,
  74. 00231                 char                    *sPeerPwd = NULL,
  75. 00232                 unsigned        nMaxSmgConn = 16,
  76. 00233                 unsigned        nMinWorkThreadsCount = 4,
  77. 00234                 unsigned        nMaxWorkThreadsCount = 8,
  78. 00235                 int                             (*OnLogWrite)(const char* pchFmt, ...) = NULL
  79. 00236                 );
  80. 00237
  81. 00241         void Release(
  82. 00242                 BOOL forceRelease = FALSE               
  83. 00243         );
  84. 00244
  85. 00250         void Submit(
  86. 00251                 sgipg_submit    ss,                                             
  87. 00252                 unsigned                        &nSeq,                          
  88. 00253                 unsigned                        &nDateTime              
  89. 00254         );
  90. 00255
  91. 00262         int AddUserNumber(
  92. 00263                 sgipg_submit* ss,                                       
  93. 00264                 const char* sUserNumber         
  94. 00265         );
  95. 00266
  96. 00270         unsigned int GetSubmitSeqId();
  97. 00271
  98. 00275         void GetSmgConnInfo(
  99. 00276                 cList & _connList
  100. 00277         ) {            
  101. 00278                 _connList = connList;
  102. 00279                 return;         
  103. 00280         }
  104. 00281
  105. 00284         //
  106. 00285         unsigned GetSmgConnCount()      {       return (unsigned)connList.size(); }
  107. 00286
  108. 00287 protected:
  109. 00288         int SubmitFunc(sgipg_submit ss, unsigned int nSeq, unsigned int nDateTime);
  110. 00289
  111. 00290 private:
  112. 00291         bool LocalListen();
  113. 00292         bool IsValidIPAddr(LPCTSTR sIPAddr);
  114. 00293         bool CreateLogFile();
  115. 00294         sgip_conn* GetSubmitConn(int &nConnIndex);
  116. 00295         void ChangeStatus(int nConnIndex, bool fBusy);
  117. 00296         int      LoginSmg(sgip_conn *pConn);
  118. 00297         void LogoutSmg(sgip_conn *pConn);
  119. 00298         bool CreateConn();
  120. 00299         bool ReleaseConn();
  121. 00300         void AddSmgConn(unsigned socketHandle, unsigned port);
  122. 00301         void RemoveSmgConn(unsigned socketHandle);
  123. 00302         CString GetDateTime();
  124. 00303         unsigned GetMaxSmgConnections() {       return m_nMaxSmgConn; }
  125. 00304
  126. 00305 private:
  127. 00306         static DWORD WINAPI SgipServFunc(LPVOID pParam);
  128. 00307         virtual DWORD SgipServProc();
  129. 00308         int      (*m_PDeliver)(DeliverStr  deliver);
  130. 00309         int      (*m_PReport)(ReportStr report);
  131. 00310         int      (*m_PResponse)(MTRespStr  response);
  132. 00315         int      (*m_PMTError)(MTErrorStr mterror);
  133. 00316         int      (*m_LogWrite)(const char* pchFmt, ...);
  134. 00317         CString GetPeerName() {         return m_sPeerName;     }
  135. 00318         CString GetPeerPwd()    {               return m_sPeerPwd;      }
  136. 00319
  137. 00320 private:
  138. 00321         CString         m_sPeerAddr;                    
  139. 00322         int                             m_nPeerPort;                    
  140. 00323         CString         m_sUserName;                    
  141. 00324         CString         m_sPwd;                                         
  142. 00325         int                             m_nConnType;                    
  143. 00326         int                             m_nSubmitConn;         
  144. 00327         CString         m_sSrcNum;                              
  145. 00328         CString         m_sLocalIPAddr;         
  146. 00329         int                             m_nLocalPort;                  
  147. 00330         CString         m_sPeerName;                    
  148. 00331         CString         m_sPeerPwd;                             
  149. 00332         unsigned        m_nMaxSmgConn;         
  150. 00333
  151. 00334         CString         m_sLogPath;                             
  152. 00335         BOOL                    m_fLogEvent;                    
  153. 00336
  154. 00337         CThreadPool     pool;                                          
  155. 00338         CWorkerSgip     m_worker;
  156. 00339         CJobSgip                *m_pJob;
  157. 00340         unsigned                m_nMinWorkThreadsCount;
  158. 00341         unsigned                m_nMaxWorkThreadsCount;
  159. 00342
  160. 00343         BOOL                            m_fStarted;                     
  161. 00344         BOOL                            m_fStop;                                
  162. 00345
  163. 00346         SOCKET                  serverSocket;           
  164. 00347         HANDLE                  m_hThread;                     
  165. 00348
  166. 00349         unsigned                m_nCounter;                     
  167. 00350
  168. 00351         sgip_conn               SubmitConn[MAX_PATH];   
  169. 00352         CCriticalSection m_arrayCs;     
  170. 00353         int                                     m_nConnIndex;           
  171. 00354         CCriticalSection m_listCs;
  172. 00355         cList                           connList;                              
  173. 00356 };
复制代码


用python开发联通的短信网关SGIP.DLL封装库
我的做法如下:
from ctypes import *
mydll=windll.LoadLibrary("examples\SGIP.dll")

结果如下:

>>> mygip=mydll.CSgip()
AttributeError: function 'CSgip' not found

>>> mygip=mydll.CSgip.CSgip()
AttributeError: function 'CSgip' not found

[ 本帖最后由 bs 于 2007-1-22 22:00 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-01-17 17:00 |只看该作者
顶一下求解决

目前发现 .dll 中如果是个类的话就无法使用

能用到.dll的,无非其中都有个函数才可以

论坛徽章:
0
3 [报告]
发表于 2007-01-17 17:43 |只看该作者
>>> from ctypes import *
>>> CDLL.sgip.SGIP
Traceback (most recent call last):
  File "<pyshell#3>", line 1, in ?
    CDLL.sgip.SGIP
AttributeError: type object 'CDLL' has no attribute 'sgip'
>>> mydll=CDLL('sgip/SGIP.dll')
>>> mydll.CSgip ()
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in ?
    mydll.CSgip ()
  File "D:\Python24\lib\site-packages\ctypes\__init__.py", line 325, in __getattr__
    func = self.__getitem__(name)
  File "D:\Python24\lib\site-packages\ctypes\__init__.py", line 330, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: function 'CSgip' not found

>>> dir(mydll)
['_FuncPtr', '__class__', '__delattr__', '__dict__', '__doc__', '__getattr__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_handle', '_name']

>>> mydll
<CDLL 'sgip/SGIP.dll', handle 1670000 at f78c70>


只做到这步...

[ 本帖最后由 bs 于 2007-1-17 17:44 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-01-17 20:41 |只看该作者
sgip请搜索啄木鸟社区.compass的框架非常适合sgip协议.建议不要调用dll,自己写协议吧.

论坛徽章:
0
5 [报告]
发表于 2007-01-22 13:22 |只看该作者
谢谢版主

但是这个dll不仅在b/s下使用,还在c/s下使用

所以是非用不可

不知为什么版主不建议使用dll呢?只要确认是安全的,我觉得比较方便 :)

论坛徽章:
0
6 [报告]
发表于 2007-01-22 22:00 |只看该作者
直接 import Sgip
出现 ImportError: dynamic module does not define init function (initCSgip)

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2007-01-23 10:11 |只看该作者
我对 C++ 写成的 dll 也不是很了解,前阵子写 Perl 程序时碰到问题,
我采用的解决方案是再写一个简单的 dll wrap 来包装一下原来的那个 dll,然后在 Perl 中来调用。相比这个方法同样适合于你。
不过希望你能找到更好的方法,我也可以借鉴一下。

论坛徽章:
0
8 [报告]
发表于 2007-01-23 11:55 |只看该作者
谢谢,版班,我也在尽量“挖掘” py 的跨平台功能,就是不知道如何突破dll这关

不过 至今没有 解决方法
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP