teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

要点を明確化

2021/12/13 10:26

投稿

yudaiyamashita
yudaiyamashita

スコア10

title CHANGED
@@ -1,1 +1,1 @@
1
- c_void_p, HCONV(), _hConvは何か?
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
  ![イメージ説明](7979d03bb8ad73f4454bd6ad3542b7c4.png)
252
262
  ![イメージ説明](177ca2e2694e7860a1980d427517b954.png)
253
263
  ![イメージ説明](299765a605623166d626a73b095e2da5.png)
254
- ![イメージ説明](71f733e87822eec9ca55fe6ef246b755.png)
264
+ ![イメージ説明](71f733e87822eec9ca55fe6ef246b755.png)
255
-
256
- 要は、_hconvつまりHCONV(), つまりc_void_pがないから、rakuten_rss.pyの仕様でエラーを返すみたいなので、そうならないようにするにはどうすればいいでしょうか。