2016-05-20 63 views
0

QtでDDE dllを作成して実装しようとしていますが、今のところ、Excelでテストした後に正常に動作することがわかっているサービスに正しく接続できません。不明な理由でDDE接続が失敗しました

DLL接続機能は以下の通りである:

UINT respTemp; 

respTemp = DdeInitializeA(&pidInst, NULL, APPCLASS_STANDARD | APPCMD_CLIENTONLY, 0L); 

//handle error messages here 
//... 

//![] 
hszService = DdeCreateStringHandleA(pidInst, (LPCSTR)service.utf16(), CP_WINANSI); //service.toLatin1().toStdString().c_str() 
hszTopic = DdeCreateStringHandleA(pidInst, (LPCSTR)topic.utf16(), CP_WINANSI); //topic.toLatin1().toStdString().c_str() 
hConv = DdeConnect(pidInst, hszService, hszTopic, NULL); 

DdeFreeStringHandle(pidInst, hszService); 
DdeFreeStringHandle(pidInst, hszTopic); 

if (!hConv) 
{ 
    UINT ddeLastError = DdeGetLastError(pidInst); 

    switch (ddeLastError) 
    { 
     case DMLERR_DLL_NOT_INITIALIZED: return DDEConn_DLLNotInitialized; 
     case DMLERR_INVALIDPARAMETER:  return DDEConn_InvalidParameter; 
     case DMLERR_NO_CONV_ESTABLISHED: return DDEConn_NoConvEstablished; 

     default:       return DDEConn_NoConnectionStablished; 
    } 
} 

connStatus = true; 

return DDEConn_NoError; 

次のようにテスト関数は次のとおりです。

void MainWindow::on_start_clicked() 
{ 
    const QString application = "profitchart"; //=profitchart|COT!VALE5.ult 
    const QString topic = "COT"; 
    const QString item = "VALE5.ult"; 

    test = CommDDE::instance(); 

    CommDDE::DDEConnectionErrorList resp = test->connect(application,topic); 

    if (resp == CommDDE::DDEConn_NoError) 
    { 
     qDebug() << "request RESULT: " << test->request(item); 
    } 
    else 
     qDebug() << "Can't connect to application" << resp; 
} 

常に私はDdeConnectを呼び出した後にエラーDMLERR_NO_CONV_ESTABLISHEDを取得する接続しようとします。そのようなエラーが発生したときに何をすべきかについての指針を見つけることができませんでした。私はこのような関数の設定の詳細についてあまり知らないので、私はこのDLLのための原材料の一部を得た作業中のdllで使用されるデフォルトの設定を使用しました。私は気づいていない別の設定を試すべきですか?コールがExcel上で動作していることを思い出してください。

答えて

0

私は答えを見つけたようです:サービスとトピック名を記述する方法は、パラメータをDdeCreateStringHandleADdeCreateStringHandleAに渡す正しい方法でした。

関連する問題