🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: borland.public.cppbuilder.nativeapi
11 messages
11 total messages Started by Muhammad Momin Rashid Tue, 13 May 2003 13:32
Sending Message over a network
#16441
Author: Muhammad Momin Rashid
Date: Tue, 13 May 2003 13:32
22 lines
1653 bytes
Hi everyone

I am trying to send a message to a networked machine (such as sent by net
send).  I have come across NetMessageBufferSend function, which I've tried
without much success.  The function is defined as follows

NET_API_STATUS NetMessageBufferSend(
    LPTSTR servername,
    LPTSTR msgname,
    LPTSTR fromname,
    LPBYTE buf,
    DWORD buflen
   );

When I tried sending a message to the same machine, a string of question
marks "????" was sent instead of the actual message.  Whereas it fails
completly while sending a message to a network machine.

Any help would be highly appreciated.

Regards,
Muhammad Momin Rashid.
Re: Sending Message over a network
#16454
Author: Remy Lebeau (TeamB)
Date: Tue, 13 May 2003 16:42
13 lines
1402 bytes
"Muhammad Momin Rashid" <momin@hotmail.com> wrote in message
news:3ec0f3fb@newsgroups.borland.com...

> When I tried sending a message to the same machine,
> a string of question marks "????" was sent instead of
> the actual message.  Whereas it fails completly while
> sending a message to a network machine.

What does your actual code look like?


Gambit
Re: Sending Message over a network
#16463
Author: Muhammad Momin Rashid
Date: Tue, 13 May 2003 20:33
50 lines
2430 bytes
Following is the code which executes on a button click

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  AnsiString asTemp = "";
  unsigned long lBufferSize = 0;

  StatusBar1->SimpleText = "Sending Message";

  asTemp = EditSendTo->Text;
  lBufferSize = asTemp.WideCharBufSize() + 1;
  wchar_t *wcSendTo = new wchar_t[lBufferSize];
  wcSendTo = asTemp.WideChar(wcSendTo, lBufferSize);

  asTemp = EditMessageFrom->Text;
  lBufferSize = asTemp.WideCharBufSize() + 1;
  wchar_t *wcFromName = new wchar_t[lBufferSize];
  wcFromName = asTemp.WideChar(wcFromName, lBufferSize);

  lBufferSize = MemoMessage->GetTextLen() + 1;
  char *cBuffer = new char[lBufferSize];
  MemoMessage->GetTextBuf(cBuffer, lBufferSize);

  int iReturn = NetMessageBufferSend(wcSendTo, wcSendTo, wcFromName,
cBuffer, lBufferSize);

 // additional code here for error checking and cleanup

  delete [] wcSendTo;
  delete [] wcFromName;
  delete [] cBuffer;
}

"Remy Lebeau (TeamB)" <gambit47@yahoo.com> wrote in message
news:3ec11fe0$1@newsgroups.borland.com...
>
> "Muhammad Momin Rashid" <momin@hotmail.com> wrote in message
> news:3ec0f3fb@newsgroups.borland.com...
>
> > When I tried sending a message to the same machine,
> > a string of question marks "????" was sent instead of
> > the actual message.  Whereas it fails completly while
> > sending a message to a network machine.
>
> What does your actual code look like?
>
>
> Gambit
>
>
Re: Sending Message over a network
#16466
Author: Jarkko Juntunen
Date: Tue, 13 May 2003 21:20
70 lines
3077 bytes
"Muhammad Momin Rashid" <momin@hotmail.com> wrote in 
news:3ec1568a@newsgroups.borland.com:

> Following is the code which executes on a button click
> 
> void __fastcall TForm1::Button1Click(TObject *Sender)
> {
>   AnsiString asTemp = "";
>   unsigned long lBufferSize = 0;
> 
>   StatusBar1->SimpleText = "Sending Message";
> 
>   asTemp = EditSendTo->Text;
>   lBufferSize = asTemp.WideCharBufSize() + 1;
>   wchar_t *wcSendTo = new wchar_t[lBufferSize];
>   wcSendTo = asTemp.WideChar(wcSendTo, lBufferSize);
> 
>   asTemp = EditMessageFrom->Text;
>   lBufferSize = asTemp.WideCharBufSize() + 1;
>   wchar_t *wcFromName = new wchar_t[lBufferSize];
>   wcFromName = asTemp.WideChar(wcFromName, lBufferSize);
> 
>   lBufferSize = MemoMessage->GetTextLen() + 1;
>   char *cBuffer = new char[lBufferSize];
>   MemoMessage->GetTextBuf(cBuffer, lBufferSize);
> 
>   int iReturn = NetMessageBufferSend(wcSendTo, wcSendTo, wcFromName,
> cBuffer, lBufferSize);
> 
>  // additional code here for error checking and cleanup
> 
>   delete [] wcSendTo;
>   delete [] wcFromName;
>   delete [] cBuffer;
> }
> 

You should cast buffer to LPBYTE, and "calculate" buffer length to 
correct value. 
Some time ago I just fight with this same thing and I think f following 
chunk of code will do the trick. 

AnsiString asRecipient = EditSendTo->Text;
AnsiString asFrom = EditMessageFrom->Text;
AnsiString asMessage = "";

for(int i=0; i<MemoMsg->Lines->Count; i++)
  {
    asMessage += MemoMessage->Lines->Strings[i];
  }    

wchar_t * MyBuffer = new wchar_t[asMessage.WideCharBufSize()];
wchar_t * MyUser = new wchar_t[asRecipient.WideCharBufSize()];
wchar_t * MySelf = new wchar_t[asFrom.WideCharBufSize()];

asMessage.WideChar(MyBuffer, asMessage.WideCharBufSize());
asRecipient.WideChar(MyUser, asRecipient.WideCharBufSize());
asFrom.WideChar(MySelf, asFrom.WideCharBufSize());

NET_API_STATUS MyStatus = NetMessageBufferSend(NULL,
                    MyUser,
                    MySelf,
                    (LPBYTE)MyBuffer,
                    wcslen(MyBuffer) * sizeof(WCHAR));
delete [] MyBuffer;
delete [] MyUser;
delete [] MySelf;

-- 
-jii
Re: Sending Message over a network
#16467
Author: Remy Lebeau (TeamB)
Date: Tue, 13 May 2003 22:54
27 lines
1821 bytes
"Muhammad Momin Rashid" <momin@hotmail.com> wrote in message
news:3ec1568a@newsgroups.borland.com...

>   lBufferSize = asTemp.WideCharBufSize() + 1;
>   wchar_t *wcSendTo = new wchar_t[lBufferSize];
>   wcSendTo = asTemp.WideChar(wcSendTo, lBufferSize);
<snip>

You could simply all of that code by utilizing the AnsiString and WideString
classes instead of doing all of that manual memory allocating/deallocating:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        StatusBar1->SimpleText = "Sending Message";

        WideString wSendTo = EditSendTo->Text;
        WideString wFromName = EditMessageFrom->Text;
        AnsiString asMsg = MemoMessage->Text;

        int iReturn = NetMessageBufferSend(wcSendTo, wcSendTo, wcFromName,
asMsg.c_str(), asMsg.Length()+1);
        ...
    }


Gambit
Re: Sending Message over a network
#16468
Author: Muhammad Momin Rashid
Date: Tue, 13 May 2003 23:26
45 lines
2641 bytes
Thanks, I'll try out your solution in a moment.  I was secretly hoping that
there is a simpler way than all these allocations/deallocations going on, so
you basically solved two of my problems :o)

Just curious, which one would be more effecient speed-wise?  Manually
allocating/deallocating as I have done ... or by using WideString as
outlined in your solution?

Regards,
Muhammad Momin Rashid


"Remy Lebeau (TeamB)" <gambit47@yahoo.com> wrote in message
news:3ec17714@newsgroups.borland.com...
>
> "Muhammad Momin Rashid" <momin@hotmail.com> wrote in message
> news:3ec1568a@newsgroups.borland.com...
>
> >   lBufferSize = asTemp.WideCharBufSize() + 1;
> >   wchar_t *wcSendTo = new wchar_t[lBufferSize];
> >   wcSendTo = asTemp.WideChar(wcSendTo, lBufferSize);
> <snip>
>
> You could simply all of that code by utilizing the AnsiString and
WideString
> classes instead of doing all of that manual memory
allocating/deallocating:
>
>     void __fastcall TForm1::Button1Click(TObject *Sender)
>     {
>         StatusBar1->SimpleText = "Sending Message";
>
>         WideString wSendTo = EditSendTo->Text;
>         WideString wFromName = EditMessageFrom->Text;
>         AnsiString asMsg = MemoMessage->Text;
>
>         int iReturn = NetMessageBufferSend(wcSendTo, wcSendTo, wcFromName,
> asMsg.c_str(), asMsg.Length()+1);
>         ...
>     }
>
>
> Gambit
>
>
Re: Sending Message over a network
#16470
Author: Muhammad Momin Rashid
Date: Tue, 13 May 2003 23:28
79 lines
3837 bytes
Thanks friend, it working now.  I tried it on a single machine, I still need
to test it on networked machines though.  Theoratically there shouldn't be
any problems there either.

Regards,
Muhammad Momin Rashid.

"Jarkko Juntunen" <dzeidzei@suolakaivos.com> wrote in message
news:Xns937B37F94604dzeidzei@207.105.83.65...
> "Muhammad Momin Rashid" <momin@hotmail.com> wrote in
> news:3ec1568a@newsgroups.borland.com:
>
> > Following is the code which executes on a button click
> >
> > void __fastcall TForm1::Button1Click(TObject *Sender)
> > {
> >   AnsiString asTemp = "";
> >   unsigned long lBufferSize = 0;
> >
> >   StatusBar1->SimpleText = "Sending Message";
> >
> >   asTemp = EditSendTo->Text;
> >   lBufferSize = asTemp.WideCharBufSize() + 1;
> >   wchar_t *wcSendTo = new wchar_t[lBufferSize];
> >   wcSendTo = asTemp.WideChar(wcSendTo, lBufferSize);
> >
> >   asTemp = EditMessageFrom->Text;
> >   lBufferSize = asTemp.WideCharBufSize() + 1;
> >   wchar_t *wcFromName = new wchar_t[lBufferSize];
> >   wcFromName = asTemp.WideChar(wcFromName, lBufferSize);
> >
> >   lBufferSize = MemoMessage->GetTextLen() + 1;
> >   char *cBuffer = new char[lBufferSize];
> >   MemoMessage->GetTextBuf(cBuffer, lBufferSize);
> >
> >   int iReturn = NetMessageBufferSend(wcSendTo, wcSendTo, wcFromName,
> > cBuffer, lBufferSize);
> >
> >  // additional code here for error checking and cleanup
> >
> >   delete [] wcSendTo;
> >   delete [] wcFromName;
> >   delete [] cBuffer;
> > }
> >
>
> You should cast buffer to LPBYTE, and "calculate" buffer length to
> correct value.
> Some time ago I just fight with this same thing and I think f following
> chunk of code will do the trick.
>
> AnsiString asRecipient = EditSendTo->Text;
> AnsiString asFrom = EditMessageFrom->Text;
> AnsiString asMessage = "";
>
> for(int i=0; i<MemoMsg->Lines->Count; i++)
>   {
>     asMessage += MemoMessage->Lines->Strings[i];
>   }
>
> wchar_t * MyBuffer = new wchar_t[asMessage.WideCharBufSize()];
> wchar_t * MyUser = new wchar_t[asRecipient.WideCharBufSize()];
> wchar_t * MySelf = new wchar_t[asFrom.WideCharBufSize()];
>
> asMessage.WideChar(MyBuffer, asMessage.WideCharBufSize());
> asRecipient.WideChar(MyUser, asRecipient.WideCharBufSize());
> asFrom.WideChar(MySelf, asFrom.WideCharBufSize());
>
> NET_API_STATUS MyStatus = NetMessageBufferSend(NULL,
>                     MyUser,
>                     MySelf,
>                     (LPBYTE)MyBuffer,
>                     wcslen(MyBuffer) * sizeof(WCHAR));
> delete [] MyBuffer;
> delete [] MyUser;
> delete [] MySelf;
>
> --
> -jii
Re: Sending Message over a network
#16471
Author: Remy Lebeau (TeamB)
Date: Tue, 13 May 2003 23:37
17 lines
1721 bytes
"Muhammad Momin Rashid" <momin@hotmail.com> wrote in message
news:3ec17fb6@newsgroups.borland.com...

> Just curious, which one would be more effecient speed-wise?
> Manually allocating/deallocating as I have done ... or by
> using WideString as outlined in your solution?

Converting an AnsiString to a WideString still performs the same kinds of
allocations.  The difference is, however, that the memory is allocated and
managed inside the VCL internally instead of your own code manually.  That
way, you can be sure that the memory is allocated correctly and will be
freed correctly later, especially in case something goes wrong in your own
code.


Gambit
Re: Sending Message over a network
#16477
Author: Jarkko Juntunen
Date: Wed, 14 May 2003 09:33
25 lines
1630 bytes
"Remy Lebeau \(TeamB\)" <gambit47@yahoo.com> wrote in
news:3ec17714@newsgroups.borland.com: 

Hi Gambit.
When I tried Your solution, I got "???????" (7 question marks) as a 
message?

>     void __fastcall TForm1::Button1Click(TObject *Sender)
>     {
>         StatusBar1->SimpleText = "Sending Message";
> 
>         WideString wSendTo = EditSendTo->Text;
>         WideString wFromName = EditMessageFrom->Text;
>         AnsiString asMsg = MemoMessage->Text;
> 
>         int iReturn = NetMessageBufferSend(wcSendTo, wcSendTo,
>         wcFromName, 
> asMsg.c_str(), asMsg.Length()+1);
>         ...
>     }
> 
> 
> Gambit
> 
> 
Re: Sending Message over a network
#16387
Author: Remy Lebeau (TeamB)
Date: Wed, 14 May 2003 16:41
18 lines
1541 bytes
"Jarkko Juntunen" <dzeidzei@suolakaivos.com> wrote in message
news:Xns937B7FC40EE86dzeidzeisuolakaivosc@207.105.83.65...

> When I tried Your solution, I got "???????" (7 question marks) as a
> message?

Then try using WideString instead of AnsiString for the message portion as
well:

    ...
    WideString wMsg = MemoMessage->Text;

    int iReturn = NetMessageBufferSend(..., (LPBYTE)wMsg.c_bstr(),
(wMsg.Length()+1)*sizeof(wchar_t));


Gambit
Re: Sending Message over a network
#16389
Author: Jarkko Juntunen
Date: Wed, 14 May 2003 17:47
12 lines
1209 bytes
"Remy Lebeau \(TeamB\)" <gambit47@yahoo.com> wrote in news:3ec27133$1
@newsgroups.borland.com:

Thanks Remy!
That one worked.

>  (LPBYTE)wMsg.c_bstr(),
> (wMsg.Length()+1)*sizeof(wchar_t));
> 

-- 
-jii
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads