2016-05-20 9 views
0

Я пытаюсь создать и реализовать DDE-dll с Qt, но пока я не могу правильно подключиться к службе, которую, как я знаю, работает после тестирования с помощью 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; 
} 

Всегда, когда я пытаюсь соединить я получаю ошибку DMLERR_NO_CONV_ESTABLISHED после вызова DdeConnect. Я не мог найти уверенности в том, что делать, когда возникает такая ошибка. Я не слишком разбираюсь в деталях настройки таких функций, поэтому использовал конфигурацию по умолчанию, используемую рабочей dll, из которой я получил часть исходного материала для этой DLL. Должен ли я попробовать другую конфигурацию, о которой я не знаю? Помня, что вызов работает над Excel.

ответ

0

Казалось бы, я нашел ответ: прокомментированный способ написания названия сервиса и темы был правильным способом передать параметры DdeCreateStringHandleA и DdeCreateStringHandleA.