質問編集履歴
1
要点を明確化
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
ddeclient.pyの167行目でDDE.ClientTransactionがFalseと値を返しているみたいなのですが
|
body
CHANGED
@@ -4,6 +4,15 @@
|
|
4
4
|
DDE通信?を使っているらしいです。
|
5
5
|
pdb(後述)を使ってデバッグをしました。
|
6
6
|
|
7
|
+
ddeclient.pyのrequest関数の中で条件分岐で
|
8
|
+
if not hDdeData:
|
9
|
+
raise DDEError("Unable to request item", self._idInst)
|
10
|
+
hDdeDataがFalseみたいです。
|
11
|
+
self._idInstとhszItemはきちんと値が入っています。
|
12
|
+
|
13
|
+
どうすればいいでしょうか。
|
14
|
+
|
15
|
+
|
7
16
|
**ddeclient.pyの一部**
|
8
17
|
```ddeclient.pyの一部
|
9
18
|
from ctypes import POINTER, WINFUNCTYPE, c_char_p, c_void_p, c_int, c_ulong, c_char_p
|
@@ -151,6 +160,54 @@
|
|
151
160
|
if not self._hConv:
|
152
161
|
raise DDEError("Unable to establish a conversation with server", self._idInst)
|
153
162
|
|
163
|
+
def __del__(self):
|
164
|
+
"""Cleanup any active connections."""
|
165
|
+
if self._hConv:
|
166
|
+
DDE.Disconnect(self._hConv)
|
167
|
+
if self._idInst:
|
168
|
+
DDE.Uninitialize(self._idInst)
|
169
|
+
|
170
|
+
def advise(self, item, stop=False):
|
171
|
+
"""Request updates when DDE data changes."""
|
172
|
+
from ctypes import byref
|
173
|
+
hszItem = DDE.CreateStringHandle(self._idInst, item, 1200)
|
174
|
+
hDdeData = DDE.ClientTransaction(LPBYTE(), 0, self._hConv, hszItem, CF_TEXT, XTYP_ADVSTOP if stop else XTYP_ADVSTART, TIMEOUT_ASYNC, LPDWORD())
|
175
|
+
DDE.FreeStringHandle(self._idInst, hszItem)
|
176
|
+
if not hDdeData:
|
177
|
+
raise DDEError("Unable to %s advise" % ("stop" if stop else "start"), self._idInst)
|
178
|
+
DDE.FreeDataHandle(hDdeData)
|
179
|
+
|
180
|
+
def execute(self, command, timeout=5000):
|
181
|
+
"""Execute a DDE command."""
|
182
|
+
pData = c_char_p(command)
|
183
|
+
cbData = DWORD(len(command) + 1)
|
184
|
+
hDdeData = DDE.ClientTransaction(pData, cbData, self._hConv, HSZ(), CF_TEXT, XTYP_EXECUTE, timeout, LPDWORD())
|
185
|
+
if not hDdeData:
|
186
|
+
raise DDEError("Unable to send command", self._idInst)
|
187
|
+
DDE.FreeDataHandle(hDdeData)
|
188
|
+
|
189
|
+
def request(self, item, timeout=5000):
|
190
|
+
"""Request data from DDE service."""
|
191
|
+
from ctypes import byref
|
192
|
+
hszItem = DDE.CreateStringHandle(self._idInst, item, 1200)
|
193
|
+
hDdeData = DDE.ClientTransaction(LPBYTE(), 0, self._hConv, hszItem, CF_TEXT, XTYP_REQUEST, timeout, LPDWORD())
|
194
|
+
DDE.FreeStringHandle(self._idInst, hszItem)
|
195
|
+
print(self._hConv, hszItem)
|
196
|
+
if not hDdeData:
|
197
|
+
raise DDEError("Unable to request item", self._idInst)
|
198
|
+
|
199
|
+
if timeout != TIMEOUT_ASYNC:
|
200
|
+
pdwSize = DWORD(0)
|
201
|
+
pData = DDE.AccessData(hDdeData, byref(pdwSize))
|
202
|
+
if not pData:
|
203
|
+
DDE.FreeDataHandle(hDdeData)
|
204
|
+
raise DDEError("Unable to access data", self._idInst)
|
205
|
+
# TODO: use pdwSize
|
206
|
+
DDE.UnaccessData(hDdeData)
|
207
|
+
else:
|
208
|
+
pData = None
|
209
|
+
DDE.FreeDataHandle(hDdeData)
|
210
|
+
return pData
|
154
211
|
```
|
155
212
|
**rakuten_rss.pyのコード**
|
156
213
|
```Python
|
@@ -158,33 +215,6 @@
|
|
158
215
|
|
159
216
|
|
160
217
|
def rss(code, item):
|
161
|
-
""" 楽天RSSから情報を取得
|
162
|
-
Parameters
|
163
|
-
----------
|
164
|
-
code : str
|
165
|
-
株価や先物のコード 例:東京電力の場合'9501.T'
|
166
|
-
item :
|
167
|
-
Returns
|
168
|
-
-------
|
169
|
-
str
|
170
|
-
|
171
|
-
Examples
|
172
|
-
----------
|
173
|
-
|
174
|
-
>>>rss('9501.T' , '始値')
|
175
|
-
'668.00'
|
176
|
-
|
177
|
-
>>>rss('9501.T' , '現在値')
|
178
|
-
'669.00'
|
179
|
-
|
180
|
-
>>>rss('9501.T' , '銘柄名称')
|
181
|
-
'東京電力HD'
|
182
|
-
|
183
|
-
>>>rss('9501.T' , '現在値詳細時刻')
|
184
|
-
'15:00:00'
|
185
|
-
|
186
|
-
"""
|
187
|
-
|
188
218
|
dde = DDEClient("rss", str(code))
|
189
219
|
try:
|
190
220
|
res = dde.request(item).decode('sjis').strip()
|
@@ -197,26 +227,6 @@
|
|
197
227
|
|
198
228
|
|
199
229
|
def rss_dict(code, *args):
|
200
|
-
"""
|
201
|
-
楽天RSSから辞書形式で情報を取り出す(複数の詳細情報問い合わせ可)
|
202
|
-
|
203
|
-
Parameters
|
204
|
-
----------
|
205
|
-
code : str
|
206
|
-
args : *str
|
207
|
-
|
208
|
-
Returns
|
209
|
-
-------
|
210
|
-
dict
|
211
|
-
|
212
|
-
Examples
|
213
|
-
----------
|
214
|
-
>>>rss_dict('9502.T', '始値','銘柄名称','現在値')
|
215
|
-
{'始値': '1739.50', '現在値': '1661.50', '銘柄名称': '中部電力'}
|
216
|
-
|
217
|
-
|
218
|
-
"""
|
219
|
-
|
220
230
|
dde = DDEClient("rss", str(code))
|
221
231
|
res = {}
|
222
232
|
try:
|
@@ -251,6 +261,4 @@
|
|
251
261
|

|
252
262
|

|
253
263
|

|
254
|
-

|
264
|
+

|
255
|
-
|
256
|
-
要は、_hconvつまりHCONV(), つまりc_void_pがないから、rakuten_rss.pyの仕様でエラーを返すみたいなので、そうならないようにするにはどうすればいいでしょうか。
|