プログラミングにおける注意点 - C++Builder/DelphiのDDE
C++Builder,Delphiに付属しているVCLのDDE ClientにあるPokeData Transactionは、非同期に固定されています。
(つまり、DdeClientTransaction APIのタイムアウト値がTIMEOUT_ASYNC)
C++Builderなどのような非同期TransactionでPopupSearch項目を使用する場合は、DdeClientTransaction APIを同期モードで呼び出す独自の関数を用意してすべてのDDEトランザクションを行うようにしてください。
(このために、PopupSearchにExecuteを用意しましたが、それだけではうまくいきませんでした(謎)
例:
bool DdePoke( TDdeClientConv *dde, AnsiString Item, AnsiString Data )
{
HSZ hszItem = DdeCreateStringHandle(ddeMgr->DdeInstId, Item.c_str(), CP_WINANSI );
if ( !hszItem ) return false;
HDDEDATA hszDat = DdeCreateDataHandle( ddeMgr->DdeInstId, Data.c_str(), Data.Length() + 1,
0, hszItem, dde->DdeFmt, 0);
bool r = false;
if ( hszDat ){
HDDEDATA hdata = DdeClientTransaction( (LPBYTE)hszDat, (DWORD)-1, (HCONV)dde->Conv, hszItem,
dde->DdeFmt, XTYP_POKE, 10000, NULL); // 同期モード(10秒待つ)
r = hdata ? true : false;
}
DdeFreeStringHandle (ddeMgr->DdeInstId, hszItem);
return r;
}