Example_vcDlg.cpp
上传用户:wuxg88
上传日期:2022-05-28
资源大小:814k
文件大小:17k
源码类别:

通讯编程

开发平台:

C++ Builder

  1. // Example_vcDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Example_vc.h"
  5. #include "Example_vcDlg.h"
  6. #include "winsock2.h"
  7. #pragma comment(lib, "ws2_32.lib")
  8. #ifndef DYNAMIC_LOAD // Static load if marked
  9. #include "DMT.h" // Static load: Step 1/2
  10. #pragma comment(lib, "DMT.lib") // Static load: Step 2/2
  11. #endif
  12. #ifdef _DEBUG
  13. #define new DEBUG_NEW
  14. #undef THIS_FILE
  15. static char THIS_FILE[] = __FILE__;
  16. #endif
  17. /////////////////////////////////////////////////////////////////////////////
  18. // CAboutDlg dialog used for App About
  19. class CAboutDlg : public CDialog
  20. {
  21. public:
  22.     CAboutDlg();
  23. // Dialog Data
  24.     //{{AFX_DATA(CAboutDlg)
  25.     enum { IDD = IDD_ABOUTBOX };
  26.     //}}AFX_DATA
  27.     // ClassWizard generated virtual function overrides
  28.     //{{AFX_VIRTUAL(CAboutDlg)
  29. protected:
  30.     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  31.     //}}AFX_VIRTUAL
  32. // Implementation
  33. protected:
  34.     //{{AFX_MSG(CAboutDlg)
  35.     //}}AFX_MSG
  36.     DECLARE_MESSAGE_MAP()
  37. };
  38. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  39. {
  40.     //{{AFX_DATA_INIT(CAboutDlg)
  41.     //}}AFX_DATA_INIT
  42. }
  43. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  44. {
  45.     CDialog::DoDataExchange(pDX);
  46.     //{{AFX_DATA_MAP(CAboutDlg)
  47.     //}}AFX_DATA_MAP
  48. }
  49. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  50.     //{{AFX_MSG_MAP(CAboutDlg)
  51.     // No message handlers
  52.     //}}AFX_MSG_MAP
  53. END_MESSAGE_MAP()
  54. /////////////////////////////////////////////////////////////////////////////
  55. // CExample_vcDlg dialog
  56. CExample_vcDlg::CExample_vcDlg(CWnd* pParent /*=NULL*/)
  57.         : CDialog(CExample_vcDlg::IDD, pParent)
  58. {
  59.     //{{AFX_DATA_INIT(CExample_vcDlg)
  60.     //}}AFX_DATA_INIT
  61.     // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  62.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  63. }
  64. void CExample_vcDlg::DoDataExchange(CDataExchange* pDX)
  65. {
  66.     CDialog::DoDataExchange(pDX);
  67.     //{{AFX_DATA_MAP(CExample_vcDlg)
  68.     DDX_Control(pDX, IDC_EDIT6, m_modbus_func_r);
  69.     DDX_Control(pDX, IDC_EDIT5, m_modbus_addr_r);
  70.     DDX_Control(pDX, IDC_COMBO6, m_comport);
  71.     DDX_Control(pDX, IDC_COMBO2, m_modbus_mode);
  72.     DDX_Control(pDX, IDC_COMBO1, m_comm_type);
  73.     DDX_Control(pDX, IDC_EDIT3, m_modbus_data_r);
  74.     DDX_Control(pDX, IDC_IPADDRESS1, m_ipaddress1);
  75.     DDX_Control(pDX, IDC_EDIT1, m_modbus_addr_s);
  76.     DDX_Control(pDX, IDC_EDIT2, m_modbus_func_s);
  77.     DDX_Control(pDX, IDC_EDIT4, m_modbus_data_s);
  78.     //}}AFX_DATA_MAP
  79. }
  80. BEGIN_MESSAGE_MAP(CExample_vcDlg, CDialog)
  81.     //{{AFX_MSG_MAP(CExample_vcDlg)
  82.     ON_WM_SYSCOMMAND()
  83.     ON_WM_PAINT()
  84.     ON_WM_QUERYDRAGICON()
  85.     ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo1)
  86. ON_WM_DESTROY()
  87. //}}AFX_MSG_MAP
  88. END_MESSAGE_MAP()
  89. /////////////////////////////////////////////////////////////////////////////
  90. // CExample_vcDlg message handlers
  91. BOOL CExample_vcDlg::OnInitDialog()
  92. {
  93.     CDialog::OnInitDialog();
  94.     // Add "About..." menu item to system menu.
  95.     // IDM_ABOUTBOX must be in the system command range.
  96.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  97.     ASSERT(IDM_ABOUTBOX < 0xF000);
  98.     CMenu* pSysMenu = GetSystemMenu(FALSE);
  99.     if (pSysMenu != NULL)
  100.     {
  101.         CString strAboutMenu;
  102.         strAboutMenu.LoadString(IDS_ABOUTBOX);
  103.         if (!strAboutMenu.IsEmpty())
  104.         {
  105.             pSysMenu->AppendMenu(MF_SEPARATOR);
  106.             pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  107.         }
  108.     }
  109.     // Set the icon for this dialog.  The framework does this automatically
  110.     //  when the application's main window is not a dialog
  111.     SetIcon(m_hIcon, TRUE); // Set big icon
  112.     SetIcon(m_hIcon, FALSE); // Set small icon
  113.     // TODO: Add extra initialization here
  114.     // Check registry serial list ----------------------------------
  115.     HKEY  hKey;
  116.     LONG  lReturn;
  117.     DWORD dwValue = 0, dwType, dwData;
  118.     DWORD dwValName;
  119.     TCHAR szValueName[256];
  120.     TCHAR szData[256];
  121.     BOOL  bIsPath;
  122.     if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,"HARDWARE\DEVICEMAP\SERIALCOMM",
  123.                      0, KEY_READ, &hKey) != ERROR_SUCCESS)
  124.     {
  125.         RegCloseKey(hKey);
  126.     }
  127.     else
  128.         bIsPath = TRUE;
  129.     while (bIsPath == TRUE)
  130.     {
  131.         dwData = sizeof(szData);
  132.         dwValName = sizeof(szValueName);
  133.         lReturn = RegEnumValue(hKey, dwValue++, szValueName, &dwValName,
  134.                                NULL, &dwType, (UCHAR*)szData, &dwData);
  135.         if (lReturn == ERROR_NO_MORE_ITEMS)
  136.             break;
  137.         //AfxMessageBox(szData); // Print COM port name
  138.         m_comport.AddString(szData); // Add to ComboBox
  139.     }
  140.     RegCloseKey(hKey);
  141.     // Initial dialog controls
  142.     m_comm_type.SetCurSel(0);
  143.     m_modbus_mode.SetCurSel(0);
  144.     m_comport.SetCurSel(0);
  145.     m_modbus_addr_s.SetWindowText("1");
  146.     m_modbus_func_s.SetWindowText("5");
  147.     m_modbus_data_s.SetWindowText("0500FF00");
  148.     OnSelchangeCombo1();
  149. #ifdef DYNAMIC_LOAD // Dynamic load
  150.     if (!InitDMT()) // Dynamic load: Step 2/3
  151.         exit(0);
  152. #endif
  153.     return TRUE;  // return TRUE  unless you set the focus to a control
  154. }
  155. void CExample_vcDlg::OnDestroy() 
  156. {
  157. CDialog::OnDestroy();
  158. #ifdef DYNAMIC_LOAD // Dynamic load
  159.     FreeLibrary(hDMTDll);
  160. #endif
  161. }
  162. void CExample_vcDlg::OnSysCommand(UINT nID, LPARAM lParam)
  163. {
  164.     if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  165.     {
  166.         CAboutDlg dlgAbout;
  167.         dlgAbout.DoModal();
  168.     }
  169.     else
  170.     {
  171.         CDialog::OnSysCommand(nID, lParam);
  172.     }
  173. }
  174. // If you add a minimize button to your dialog, you will need the code below
  175. //  to draw the icon.  For MFC applications using the document/view model,
  176. //  this is automatically done for you by the framework.
  177. void CExample_vcDlg::OnPaint()
  178. {
  179.     if (IsIconic())
  180.     {
  181.         CPaintDC dc(this); // device context for painting
  182.         SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  183.         // Center icon in client rectangle
  184.         int cxIcon = GetSystemMetrics(SM_CXICON);
  185.         int cyIcon = GetSystemMetrics(SM_CYICON);
  186.         CRect rect;
  187.         GetClientRect(&rect);
  188.         int x = (rect.Width() - cxIcon + 1) / 2;
  189.         int y = (rect.Height() - cyIcon + 1) / 2;
  190.         // Draw the icon
  191.         dc.DrawIcon(x, y, m_hIcon);
  192.     }
  193.     else
  194.     {
  195.         CDialog::OnPaint();
  196.     }
  197. }
  198. // The system calls this to obtain the cursor to display while the user drags
  199. //  the minimized window.
  200. HCURSOR CExample_vcDlg::OnQueryDragIcon()
  201. {
  202.     return (HCURSOR) m_hIcon;
  203. }
  204. void CExample_vcDlg::OnOK()
  205. {
  206.     CString strTmp = "";
  207.     CString strTmp1 = "";
  208.     CString strTmp3 = "";
  209.     char charTmp[8];
  210. int conn_num = 1; // Connection index 0-256 connection
  211. int comm_type = m_comm_type.GetCurSel(); // Communication Type, 0:Serial, 1:Ethernet
  212. int status = 0;
  213.     unsigned char ASC[2] = {0}; // Used to Convert HEX value to ASCII
  214.     unsigned char ASCI[2] = {0};
  215.     int i = 0, l = 0, sendlen = 0;
  216.     // Declare send variable
  217.     unsigned char sendbuf[10];
  218.     int modbus_addr;
  219.     int modbus_func;
  220.     // Declare receive variable
  221.     unsigned char recvbuf[20] = {0};
  222.     int modbus_addr_r = 0;
  223.     int modbus_func_r = 0;
  224.     // Fetch input ip
  225.     DWORD remote_addr;
  226.     m_ipaddress1.GetAddress(remote_addr);
  227.     // Fetch input modbus address (Decimal)
  228.     m_modbus_addr_s.GetWindowText(strTmp);
  229.     modbus_addr = atoi((LPCTSTR)strTmp);
  230.     // Fetch input modbus function (Decimal)
  231.     m_modbus_func_s.GetWindowText(strTmp);
  232.     strncpy(charTmp, (LPCTSTR)strTmp, sizeof(charTmp));
  233.     // Convert Hex String to Integer
  234.     modbus_func = HexStr_to_Int(charTmp);
  235.     // Fetch input modbus data (Hexadecimal )
  236.     m_modbus_data_s.GetWindowText(strTmp);
  237. // strTmp.MakeUpper(); // Conver to upper case
  238.     // Check if Modbus data length is even
  239.     if (strTmp.GetLength()%2 != 0)
  240.     {
  241.         AfxMessageBox("Modbus data length must be even numbers");
  242.         return;
  243.     }
  244.     // Convert ASCII to HEX value
  245.     if (strTmp.GetLength() > 0)
  246.     {
  247.         // Convert 2bytes string to hex
  248.         for (i=0; i < strTmp.GetLength(); i+=2)
  249.         {
  250.             ASCI[0] = strTmp[i]; //High byte
  251.             ASCI[1] = strTmp[i+1]; //Lowb yte
  252.             sendbuf[l] = ASCI_to_HEX(ASCI);
  253.             l++;
  254.         }
  255.         sendlen = l;
  256.     }
  257.     // Select Communication Type
  258.     switch (comm_type)
  259.     {
  260. case 0: // Modbus
  261. {
  262. CString strTmp = "";
  263. int numTmp = 0, conn_num = 0;
  264. // Get COM port name
  265. m_comport.GetWindowText(strTmp);
  266. // Get Modbus mode
  267. numTmp = m_modbus_mode.GetCurSel();
  268. strTmp.Delete(0, 3);
  269. // Get COM number
  270. conn_num = atoi(strTmp);
  271. if (numTmp == 0)
  272. status = OpenModbusSerial(conn_num, 9600, 7, 'E', 1, numTmp+1); // Modbus Type, 1:MODBUS_ASCII, 2:MODBUS_RTU
  273. else
  274. status = OpenModbusSerial(conn_num, 9600, 8, 'N', 1, numTmp+1);
  275. if (status > 0)
  276. {
  277. int a, b;
  278. // Send & Receive Data
  279. a = RequestData(comm_type, conn_num, 1, modbus_func, sendbuf, sendlen); // Send
  280. b = ResponseData(comm_type, conn_num, &modbus_addr_r, &modbus_func_r, recvbuf); // Receive
  281. if (b > 0)
  282. {
  283. // Convert HEX value to ASCII
  284. for (int j = 0; j < b; j++)
  285. {
  286. HEX_to_ASCI(recvbuf[j], ASC);
  287. strTmp.Format("%C%C", ASC[0],ASC[1]);
  288. strTmp1.Insert(strTmp1.GetLength()+1,(LPCTSTR)strTmp);
  289. }
  290. strTmp3.Format("%d" ,modbus_addr_r);
  291. m_modbus_addr_r.SetWindowText(strTmp3); // Response address
  292. strTmp3.Format("%X" ,modbus_func_r);
  293. m_modbus_func_r.SetWindowText(strTmp3); // Response function code
  294. m_modbus_data_r.SetWindowText(strTmp1); // Show response data
  295. }
  296. else
  297. {
  298. AfxMessageBox("No data received.");
  299. m_modbus_addr_r.SetWindowText("");
  300. m_modbus_func_r.SetWindowText("");
  301. m_modbus_data_r.SetWindowText("");
  302. }
  303. CloseSerial(conn_num);
  304. }
  305. else
  306. AfxMessageBox("Serial Error");
  307. break;
  308. }
  309. case 1: // Modbus/TCP
  310. {
  311. conn_num = 0; // Connection number
  312. // Open TCP Socket
  313. status = OpenModbusTCPSocket(conn_num, htonl(remote_addr));
  314. if (status > 0)
  315. {
  316. int a, b;
  317. // Send & Receive Data
  318. a = RequestData(comm_type, conn_num, modbus_addr, modbus_func, sendbuf, sendlen); // Send
  319. if (ReadSelect(conn_num, 100))
  320. b = ResponseData(comm_type, conn_num, &modbus_addr_r, &modbus_func_r, recvbuf); // Receive
  321. if (b > 0)
  322. {
  323. // Convert HEX value to ASCII
  324. for (int j = 0; j < b; j++)
  325. {
  326. HEX_to_ASCI(recvbuf[j], ASC);
  327. strTmp.Format("%C%C", ASC[0],ASC[1]);
  328. strTmp1.Insert(strTmp1.GetLength()+1,(LPCTSTR)strTmp);
  329. }
  330. strTmp3.Format("%d" ,modbus_addr_r);
  331. m_modbus_addr_r.SetWindowText(strTmp3); // Response address
  332. strTmp3.Format("%X" ,modbus_func_r);
  333. m_modbus_func_r.SetWindowText(strTmp3); // Response function code
  334. m_modbus_data_r.SetWindowText(strTmp1); // Show response data
  335. }
  336. else
  337. {
  338. AfxMessageBox("No data received.");
  339. m_modbus_addr_r.SetWindowText("");
  340. m_modbus_func_r.SetWindowText("");
  341. m_modbus_data_r.SetWindowText("");
  342. }
  343. CloseSocket(conn_num);
  344. }
  345. else
  346. AfxMessageBox("Socket Error");
  347. break;
  348. }
  349. }
  350. m_modbus_data_s.GetWindowText(strTmp);
  351. if (strTmp == "0500FF00")
  352. m_modbus_data_s.SetWindowText("05000000");
  353. else
  354. m_modbus_data_s.SetWindowText("0500FF00");
  355. // CDialog::OnOK();
  356. }
  357. // Convert ASCII to Hex
  358. unsigned char CExample_vcDlg::ASCI_to_HEX(unsigned char asci[])
  359. {
  360.     unsigned char value_hex = 0x00;
  361.     int i;
  362.     for (i=0;i<2;i++) //High byte 0, Low byte 1
  363.     {
  364.         if (asci[i] >= 0x30 && asci[i] <= 0x39) // 0 - 9
  365.             value_hex = (unsigned char)((value_hex*16)+(asci[i]-0x30));
  366.         else if (asci[i] >= 0x41 && asci[i] <= 0x46) // A - F
  367.             value_hex = (unsigned char)((value_hex*16)+(asci[i]-0x37));
  368.         else if (asci[i] >= 0x61 && asci[i] <= 0x66) // a - f
  369.             value_hex = (unsigned char)((value_hex*16)+(asci[i]-0x57));
  370.     }
  371.     return value_hex;
  372. }
  373. // Convert Hex to ASCII
  374. void CExample_vcDlg::HEX_to_ASCI(unsigned char value_hex, unsigned char *asci)
  375. {
  376.     unsigned char reglow,reghigh;
  377.     reghigh = (unsigned char)((value_hex & 0xf0) >> 4);
  378.     reglow = (unsigned char)(value_hex & 0x0f);
  379.     if (reghigh <= 9)
  380.         asci[0] = (unsigned char)(reghigh + 0x30); //low byte
  381.     else
  382.         asci[0] = (unsigned char)((reghigh - 10) + 0x41);
  383.     if (reglow <= 9)
  384.         asci[1] = (unsigned char)(reglow + 0x30); //high byte
  385.     else
  386.         asci[1] = (unsigned char)((reglow - 10) + 0x41);
  387. }
  388. // Convert a "Hex String" to an Integer
  389. int CExample_vcDlg::HexStr_to_Int(const TCHAR *value)
  390. {
  391.     struct CHexMap
  392.     {
  393.         TCHAR chr;
  394.         int value;
  395.     };
  396.     const int HexMapL = 16;
  397.     CHexMap HexMap[HexMapL] =
  398.     {
  399.         {'0', 0}, {'1', 1},
  400.         {'2', 2}, {'3', 3},
  401.         {'4', 4}, {'5', 5},
  402.         {'6', 6}, {'7', 7},
  403.         {'8', 8}, {'9', 9},
  404.         {'A', 10}, {'B', 11},
  405.         {'C', 12}, {'D', 13},
  406.         {'E', 14}, {'F', 15}
  407.     };
  408.     TCHAR *mstr = _tcsupr(_tcsdup(value));
  409.     TCHAR *s = mstr;
  410.     int result = 0;
  411.     if (*s == '0' && *(s + 1) == 'X') s += 2;
  412.     bool firsttime = true;
  413.     while (*s != '')
  414.     {
  415.         bool found = false;
  416.         for (int i = 0; i < HexMapL; i++)
  417.         {
  418.             if (*s == HexMap[i].chr)
  419.             {
  420.                 if (!firsttime) result <<= 4;
  421.                 result |= HexMap[i].value;
  422.                 found = true;
  423.                 break;
  424.             }
  425.         }
  426.         if (!found) break;
  427.         s++;
  428.         firsttime = false;
  429.     }
  430.     free(mstr);
  431.     return result;
  432. }
  433. void CExample_vcDlg::OnSelchangeCombo1()
  434. {
  435.     int numTmp = m_comm_type.GetCurSel();
  436.     switch (numTmp)
  437.     {
  438.     case 0:
  439.         m_modbus_mode.SetCurSel(0);
  440.         m_comport.EnableWindow(TRUE);
  441.         m_modbus_mode.EnableWindow(TRUE);
  442.         m_ipaddress1.EnableWindow(FALSE);
  443.         break;
  444.     case 1:
  445.         m_modbus_mode.SetCurSel(1);
  446.         m_comport.EnableWindow(FALSE);
  447.         m_modbus_mode.EnableWindow(FALSE);
  448.         m_ipaddress1.EnableWindow(TRUE);
  449.         break;
  450.     }
  451. }
  452. #ifdef DYNAMIC_LOAD // Dynamic load
  453. // Dynamic load: Step 3/3
  454. BOOL CExample_vcDlg::InitDMT()
  455. {
  456. // Load Communication Library
  457. hDMTDll = LoadLibraryEx("DMT", NULL, 0);
  458. if (hDMTDll == NULL)
  459. {
  460. AfxMessageBox(_T("Can't load DMT !!"));
  461. return FALSE;
  462. }
  463. // Open Modbus Serial
  464. OpenModbusSerial = (int (WINAPI *)(int, int, int, char, int, int))GetProcAddress(hDMTDll, "OpenModbusSerial");
  465. if (OpenModbusSerial == NULL)
  466. {
  467. AfxMessageBox(_T("OpenModbusSerial function not in DMT.dll !!"));
  468. return FALSE;
  469. }
  470. // Close Serial
  471. CloseSerial = (void (WINAPI *)(int))GetProcAddress(hDMTDll, "CloseSerial");
  472. if (CloseSerial == NULL)
  473. {
  474. AfxMessageBox(_T("CloseSerial function not in DMT.dll !!"));
  475. return FALSE;
  476. }
  477. // Get Serial Error Message Function
  478. GetLastSerialErr = (int (WINAPI *)())GetProcAddress(hDMTDll, "GetLastSerialErr");
  479. if (GetLastSerialErr == NULL)
  480. {
  481. AfxMessageBox(_T("GetLastSerialErr function not in DMT.dll !!"));
  482. return FALSE;
  483. }
  484. // Clear Serial Error Message Function
  485. ResetSerialErr = (void (WINAPI *)())GetProcAddress(hDMTDll, "ResetSerialErr");
  486. if (ResetSerialErr == NULL)
  487. {
  488. AfxMessageBox(_T("ResetSerialErr function not in DMT.dll !!"));
  489. return FALSE;
  490. }
  491. // Open Modbus TCP Socket
  492. OpenModbusTCPSocket = (int (WINAPI *)(int, int))GetProcAddress(hDMTDll, "OpenModbusTCPSocket");
  493. if (OpenModbusTCPSocket == NULL)
  494. {
  495. AfxMessageBox("OpenModbusTCPSocket function not in DMT.dll !!!");
  496. return FALSE;
  497. }
  498. // Close Socket
  499. CloseSocket = (void (WINAPI *)(int))GetProcAddress(hDMTDll, "CloseSocket");
  500. if (CloseSocket == NULL)
  501. {
  502. AfxMessageBox(_T("CloseSocket function not in DMT.dll !!"));
  503. return FALSE;
  504. }
  505. // Read Select
  506. ReadSelect = (int (WINAPI *)(int, int))GetProcAddress(hDMTDll, "ReadSelect");
  507. if (ReadSelect == NULL)
  508. {
  509. AfxMessageBox(_T("ReadSelect function not in DMT.dll !!"));
  510. return FALSE;
  511. }
  512. // Get Socket Error Message Function
  513. GetLastSocketErr = (int (WINAPI *)())GetProcAddress(hDMTDll, "GetLastSocketErr");
  514. if (GetLastSocketErr == NULL)
  515. {
  516. AfxMessageBox(_T("GetLastSocketErr function not in DMT.dll !!"));
  517. return FALSE;
  518. }
  519. // Clear Socket Error Message Function
  520. ResetSocketErr = (void (WINAPI *)())GetProcAddress(hDMTDll, "ResetSocketErr");
  521. if (ResetSocketErr == NULL)
  522. {
  523. AfxMessageBox(_T("ResetSocketErr function not in DMT.dll !!"));
  524. return FALSE;
  525. }
  526. // Request Modbus Data
  527. RequestData = (int (WINAPI *)(int, int, int, int, const unsigned char *,int))GetProcAddress(hDMTDll, "RequestData");
  528. if (RequestData == NULL)
  529. {
  530. AfxMessageBox(_T("RequestData function not in DMT.dll !!"));
  531. return FALSE;
  532. }
  533. // Response Modbus Data
  534. ResponseData = (int (WINAPI *)(int, int, int *, int *, unsigned char *))GetProcAddress(hDMTDll, "ResponseData");
  535. if (ResponseData == NULL)
  536. {
  537. AfxMessageBox(_T("ResponseData function not in DMT.dll !!"));
  538. return FALSE;
  539. }
  540. return TRUE;
  541. }
  542. #endif