Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions

boost for my simple DDE application

Posted on 2000-04-19
Last Modified: 2008-02-26
Hi !
I want to build an app. which will monitor my IE and NetScape using DDE Services. But I don't know how to start that as I am a novice to DDE. Thus, I want some code for the client DDE which can connect to NETSCAPE and IE. and whenever a user goes to a web site, my app. can display that uRL in a messagebox. I am already lost in the wilderness of MSDN. So, please help me with some code sample.

I had written a small dialog based  app. to act as a DDE client, but it's not working the correct way.....    :-(

These are the things I had implemented :

the constructor of app. lok likes :

extern DWORD dwidInst;   //Global variable

      // Initialization of dde application.
      if(DdeInitialize(&dwidInst, LocationDdeCallBack, APPCLASS_MONITOR|MF_POSTMSGS|MF_CONV|MF_CALLBACKS, 0ul)){
            dwidInst = 0UL;

then in the OnInitDialog() of my dialog class, I had written the following code :

int OnInitDialog()

      HCONV hConv = NULL;
      CString csItem = "";
      CString csTemp = "";

      if(dwidInst == 0UL){
                  MessageBox(NULL,"Dde Initialization Failed...","Error", MB_OK);
      //Connect to the Netscape server.
      HSZ hszService = DdeCreateStringHandle(dwidInst, "NETSCAPE", CP_WINANSI);
      hConv = DdeConnect(dwidInst, hszService,0L, NULL);
      // Check for the connection
      if(hConv == 0UL){
            char *sTemp = "Unable to start convertion with NETSCAPE...";
            MessageBox(NULL,sTemp, "Error", MB_OK);

      CString csItem;

      //This seems to be a bottlenect. Please guide me how can I decide the correct values for csItem

      HSZ hszItem = DdeCreateStringHandle(dwidInst, csItem, CP_WINANSI);
      HDDEDATA hRetVal = DdeClientTransaction(NULL, 0ul, hConv, hszItem, CF_TEXT, XTYP_ADVSTART, 5000L, NULL);
      //UINT k=DdeGetLastError(dwidInst);
      //The hRetValue always comes out to be 0 ?????
      //The value of k tells INVALID PARAMETER

//My Call back functions looks like this:
//Just to know which all messages i am receiving

HDDEDATA CALLBACK LocationDdeCallBack(UINT type, UINT fmt,
      HCONV hconv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1,
      DWORD dwData2)      {
      CNetObj cn;

      CString c2 = cn.GetString(hsz1);
      if(!c2.IsEmpty())      AfxMessageBox(c2);

      case      XTYPF_NOBLOCK:
      case      XTYPF_NODATA:
      case      XTYPF_ACKREQ:
      case      XCLASS_MASK:
      case      XCLASS_BOOL:  
      case      XCLASS_DATA:
            AfxMessageBox("XCLASS_DATA ");
      case      XCLASS_FLAGS:    
            AfxMessageBox("XCLASS_FLAGS ");
      case      XCLASS_NOTIFICATION:
            AfxMessageBox("XCLASS_NOTIFICATION ");
      case      XTYP_ERROR:
            AfxMessageBox("XTYP_ERROR ");
      case      XTYP_ADVDATA:
            AfxMessageBox("XTYP_ADVDATA ");
      case      XTYP_ADVREQ:
            AfxMessageBox(" XTYP_ADVREQ");
      case      XTYP_ADVSTART:
            AfxMessageBox("XTYP_ADVSTART ");
      case      XTYP_ADVSTOP:
            AfxMessageBox(" XTYP_ADVSTOP");
      case      XTYP_EXECUTE:
            AfxMessageBox("XTYP_EXECUTE ");
      case      XTYP_XACT_COMPLETE:
            AfxMessageBox("XTYP_XACT_COMPLETE ");
      case      XTYP_REGISTER:
            AfxMessageBox("XTYP_REGISTER ");
      case      XTYP_UNREGISTER:
            AfxMessageBox("XTYP_UNREGISTER ");
      case XTYP_CONNECT :
            AfxMessageBox("XTYP_CONNECT ");
            AfxMessageBox("XTYP_CONNECTCONFIRM ");
      case XTYP_DISCONNECT :
            AfxMessageBox("XTYP_DISCONNECT ");
      case XTYP_POKE :
            AfxMessageBox("XTYP_POKE ");
      case XTYP_REQUEST :
      return (HDDEDATA) NULL;

Right now when i run this application i only get XTYP_REGISTER message when i starts netscape,
and XTYP_UNREGISTER when i closes the netscape browser
and nothing else

I am a novice to DDE programming and MSDN samples are too bulky for me...
 so please guide me and tell me what's wrong with the code

I just want to receive all the URL addresses that the user is visiting.

Question by:sun307
  • 5
  • 4

Expert Comment

ID: 2732224
Your parameter to XTYP_ADVSTART is wrong.  It needs to specify the topic that you are interested in, instead of just "0".

But I think that you should really try looking at: http://developer.netscape.com/docs/manuals/communicator/DDE/abtdde.htm

and, more specifically:

Which, I think, is closer to what you really want to do.

(IE uses a similar enough DDE interface, so your code should be able to run off of both.  Your milage may vary.... ;)

Author Comment

ID: 2732812
thanx abesoft!
I had tried that but couldn't figure out the correct parameter. the netscape document for www_registerurlecho just has the following lines and it's dificult to make out the parameter from there :
Netscape is: Server.

Transaction Type: XTYP_POKE.

Item (Arguments): qcsServer
qcsServer is the DDE server that wishes to receive WWW_URLEcho topics.

Description: This topic registers qcsServer to be notified when the loading of a URL occurs, via the WWW_URLEcho topic. Multiple servers can be registered with this topic. None are denied registration. The SDI draft at the time this document was written indicates the transaction type as XTYP_REQUEST, which is a possible incompatibility.

Author Comment

ID: 2733930
This question has a deletion request Pending
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.


Expert Comment

ID: 2752157
This question no longer is pending deletion

Accepted Solution

abesoft earned 300 total points
ID: 2752158

HSZ hszItem = DdeCreateStringHandle(dwidInst, csItem, CP_WINANSI);
// register your server name
DdeNameService( dwidInst, csItem, 0, DNS_REGISTER);
// Ask NS to send URL's to that server.
HDDEDATA hRetVal = DdeClientTransaction(NULL, 0ul, hConv, hszItem, CF_TEXT, XTYP_REQUEST, 5000L, NULL);
// Or maybe XTYP_POKE?

For "myServerName", you should substitute the name of your DDE server.  You will also need to call DdeNameService to unregister your server name before termination.

Author Comment

ID: 2754243
Hi abesoft!
can u clarify one more point....
does the same application can work for IE too ....????

Expert Comment

ID: 2755322
I did this unser IE and Netscape about five years ago, and the same thing worked for both of them.  (There may have been differences, but they were minor.  The service names were different, obviously.)

Oh, by the way, I didn't compile or test the code snippet that I gave you, so you may need to massage it to get it to fit.  Good Luck!

Author Comment

ID: 2952040
Answer accepted

Author Comment

ID: 2952041
Thanx and I am sorry for accepting ur answer so late

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Many modern programming languages support the concept of a property -- a class member that combines characteristics of both a data member and a method.  These are sometimes called "smart fields" because you can add logic that is applied automaticall…
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

839 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question