質問編集履歴
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の仕様でエラーを返すみたいなので、そうならないようにするにはどうすればいいでしょうか。
         | 
