Экспорт инструментов по DDE

Страницы: 1
RSS
Экспорт инструментов по DDE
 
В разделе 6 руководства описан функционал экспорта инструментов по ODBC.
Очень бы хотелось иметь аналог по DDE. Хочется искать плиты в стаканах :)

На мой взгляд DDE гораздо лучше ODBC, странно что его обделили вниманием.

1. Он быстрее, так как осуществляется через shared mem
2. Он позволяет не мучиться с генерацией сигналов об обновлении данных. (В случае через ODBC, к примеру, это означает или использовать триггеры или читать журнал транзакий, что медленнее на несколько порядков)
 
Цитата
foobar написал:
Очень бы хотелось иметь аналог по DDE.
По секрету, можно сделать свой ODBC драйвер, в качестве примера годится (опенсорцный) драйвер от mysql. Там "всего" около 70 апишных функций надо реализовать, не считая, конечно, собственно логики сервера, ака что куда и как рассовывать. Для DDE нужно окно, поэтому сомнительно, что без открытых стаканов сделают, из главного окна квика выводить все и сразу геморрою не оберешься.
 
Цитата
foobar написал:
Очень бы хотелось иметь аналог по DDE.
Так есть же.
 
Цитата
Imersio Arrigo написал:
Так есть же.
Как я понял, идея выводить стаканы по DDE без открытия самих стаканов. По факту данные по DDE выводит какое-то окно, так что на практике получится либо просто невидимый стакан, либо одно (невидимое) окно на весь квик, занятое только DDE-экспортом всего и вся.
 
Цитата
Anton написал:
По факту данные по DDE выводит какое-то окно,
Так вроде и с одбц такая же схема, не?
 
Цитата
Imersio Arrigo написал:
Так вроде и с одбц такая же схема, не?
Нет, по ODBC можно даже из консольного приложения вывести (пример), DDE же в принципе основано на том, что два окна обмениваются сообщениями.
 
Цитата
Anton написал:
Цитата
Imersio Arrigo написал:
Так вроде и с одбц такая же схема, не?
Нет, по ODBC можно даже из консольного приложения вывести ( пример ), DDE же в принципе основано на том, что два окна обмениваются сообщениями.
Так в windows всё является окном и имеет hwnd.  
 
Вот тут расписано подробно https://docs.microsoft.com/en-us/windows/win32/dataxchg/about-dynamic-data-exchange#dynamic-data-exc...
К открытым (равно как и невидимым окнам) это не имеет никакого отношения. Консольные программы тоже могут получить или отправлять DDE-сообщения.
 
Цитата
foobar написал:
Так в windows всё является окном и имеет hwnd.  
Нет. Процесс, поток, мьютекс, сокет, файл мэппинг и многое-многое другое не являются окном и не имеют hwnd.
Цитата
foobar написал:
К открытым (равно как и невидимым окнам) это не имеет никакого отношения.
Сильное заявление.
Цитата
foobar написал:
Вот тут расписано подробно
Именно: All DDE transactions are conducted by passing certain defined  DDE messages between the client and server windows.
Цитата
foobar написал:
Консольные программы тоже могут получить или отправлять DDE-сообщения.
Отправлять сообщения могут, никто не мешает. Чтобы сообщения получать, надо создать окно и дергать GetMessage или PeekMessage, причем после первого же вызова одной из этих функций поток станет гуишным (можно проверить, вызвав IsGUIThread). Работать с DDE из консольной программы можно через либу ddeml, которая как раз и создает кучку скрытых окон под ковром.
 
Цитата
Anton написал:
Нет, по ODBC можно даже из консольного приложения вывести
Причем тут консольное? Мы же про Квик говорим, не?
А в квике можно запустить экспорт что по ODBC что по DDE только из определенного окна, разве нет?
 
Цитата
Imersio Arrigo написал:
Причем тут консольное?
В смысле для работы ODBC не требуется окна и очереди сообщений. В квике можно стаканы по ODBC выводить, не открывая окон, о чем изначально и речь была, почему по ODBC так можно, а по DDE нельзя. Потому что для DDE окно все равно придется создавать, будь то нынешний стакан или какой-то его невидимый обрезок.
 
Цитата
Anton написал:
В смысле для работы ODBC не требуется окна и очереди сообщений
Это, вроде как, очевидно
Цитата
Anton написал:
В квике можно стаканы по ODBC выводить, не открывая окон, о чем изначально и речь была,
Вот как? Научи?
Мне не нужно, просто я вижу пункты меню там же где и dde, поэтому считаю что и вывод возможен там же - а это исключительно из открытых таблиц.
 
Цитата
Anton написал:

Отправлять сообщения могут, никто не мешает. Чтобы сообщения получать, надо создать окно и дергать GetMessage или PeekMessage, причем после первого же вызова одной из этих функций поток станет гуишным (можно проверить, вызвав IsGUIThread). Работать с DDE из консольной программы можно через либу ddeml, которая как раз и создает кучку скрытых окон под ковром.
Ну, всё может быть. Я писал на Java и не думал особо что происходит. В любом случае, я не вижу каких либо проблем для терминала. Там можно найти/сделать того кто будет отвечать и посылать сообщения.
 
Цитата
Imersio Arrigo написал:

Вот как? Научи?
Мне не нужно, просто я вижу пункты меню там же где и dde, поэтому считаю что и вывод возможен там же - а это исключительно из открытых таблиц.
Сервисы - Импорт/Экспорт - Экспорт инструментов по ODBC
 
Цитата
Anton написал:
Чтобы сообщения получать, надо создать окно и дергать GetMessage или PeekMessage
Если не ошибаюсь, очередь сообщений тут не причем.

Во всяком случае у меня работало без нее.

Цитата
foobar написал:
Сервисы - Импорт/Экспорт - Экспорт инструментов по ODBC
Никогда не обращал внимания.

Экспортятся прям стаканы?

Ну в таком случае, я думаю, что  технически ничего не мешает также экспортить стаканы по DDE.
 
Цитата
Imersio Arrigo написал:
Если не ошибаюсь, очередь сообщений тут не причем. Во всяком случае у меня работало без нее.
С ddeml могло и без нее работать, там внутри делается примерно таким образом (внимание на while в последнем блоке, который и есть "локальный" цикл сообщений)
Код
BOOL PostDataMessage(HWND hwndServer, HWND hwndClient, int iState, BOOL fDeferUpd, BOOL fAckReq, BOOL fResponse)
{
   ATOM aItem;
   char szPopulation[16];
   DDEACK DdeAck;
   DDEDATA *pDdeData;
   DWORD dwTime;
   GLOBALHANDLE hDdeData;
   MSG msg;
   WORD wStatus;
   aItem = GlobalAddAtom(pop[iState].szState);
   // Allocate a DDEDATA structure if not deferred update
   if(fDeferUpd)
      hDdeData = NULL;
   else
   {
      wsprintf(szPopulation, "%ld\r\n", pop[iState].lPop);
      hDdeData = GlobalAlloc(GHND | GMEM_DDESHARE, sizeof(DDEDATA) + strlen(szPopulation));
      pDdeData =(DDEDATA *) GlobalLock(hDdeData);
      pDdeData->fResponse = fResponse;
      pDdeData->fRelease = TRUE;
      pDdeData->fAckReq = fAckReq;
      pDdeData->cfFormat = CF_TEXT;
      lstrcpy((PSTR) pDdeData->Value, szPopulation);
      GlobalUnlock(hDdeData);
   }
   // Post the WM_DDE_DATA iMsg
   if(!PostMessage(hwndClient, WM_DDE_DATA,(WPARAM) hwndServer, PackDDElParam(WM_DDE_DATA,(UINT) hDdeData, aItem)))
   {
      if(hDdeData != NULL)
      GlobalFree(hDdeData);
      GlobalDeleteAtom(aItem);
      return FALSE;
   }
   // Wait for the acknowledge iMsg if it's requested
   if(fAckReq)
   {
      DdeAck.fAck = FALSE;
      dwTime = GetCurrentTime();
      while(GetCurrentTime() - dwTime < DDE_TIMEOUT)
      {
         if(PeekMessage(&msg, hwndServer, WM_DDE_ACK, WM_DDE_ACK, PM_REMOVE))
         {
            wStatus = LOWORD(msg.lParam);
            DdeAck = *((DDEACK *) &wStatus);
            aItem = HIWORD(msg.lParam);
            GlobalDeleteAtom(aItem);
            break;
         }
      }
      if(DdeAck.fAck == FALSE)
      {
         if(hDdeData != NULL)
         GlobalFree(hDdeData);
         return FALSE;
      }
   }
   return TRUE;
}
Страницы: 1
Читают тему (гостей: 1)
Наверх