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
Author: Muhammad Momin Rashid
Date: Tue, 13 May 2003 13:32
Date: Tue, 13 May 2003 13:32
22 lines
1653 bytes
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
Author: Remy Lebeau (TeamB)
Date: Tue, 13 May 2003 16:42
Date: Tue, 13 May 2003 16:42
13 lines
1402 bytes
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
Author: Muhammad Momin Rashid
Date: Tue, 13 May 2003 20:33
Date: Tue, 13 May 2003 20:33
50 lines
2430 bytes
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
Author: Jarkko Juntunen
Date: Tue, 13 May 2003 21:20
Date: Tue, 13 May 2003 21:20
70 lines
3077 bytes
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
Author: Remy Lebeau (TeamB)
Date: Tue, 13 May 2003 22:54
Date: Tue, 13 May 2003 22:54
27 lines
1821 bytes
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
Author: Muhammad Momin Rashid
Date: Tue, 13 May 2003 23:26
Date: Tue, 13 May 2003 23:26
45 lines
2641 bytes
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
Author: Muhammad Momin Rashid
Date: Tue, 13 May 2003 23:28
Date: Tue, 13 May 2003 23:28
79 lines
3837 bytes
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
Author: Remy Lebeau (TeamB)
Date: Tue, 13 May 2003 23:37
Date: Tue, 13 May 2003 23:37
17 lines
1721 bytes
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
Author: Jarkko Juntunen
Date: Wed, 14 May 2003 09:33
Date: Wed, 14 May 2003 09:33
25 lines
1630 bytes
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
Author: Remy Lebeau (TeamB)
Date: Wed, 14 May 2003 16:41
Date: Wed, 14 May 2003 16:41
18 lines
1541 bytes
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
Author: Jarkko Juntunen
Date: Wed, 14 May 2003 17:47
Date: Wed, 14 May 2003 17:47
12 lines
1209 bytes
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