|
Oh yeah, the marshalling for a BSTR * is probably smaller/quicker than BSTR. Maybe. I'm no expert...
------------------------
Derek Waters
derek@lj-oz.com
|
|
|
|
|
The marshalling speed is not affected by whether you use a BSTR or a BSTR*.
When the COM object is instantiated as an INPROC_SERVER, the BSTR has one less pointer dereference, then memory is read from both types in the same way.
When the object is instantiated as a LOCAL_SERVER, or a REMOTE_SERVER, the data from both strings is completely packaged up and marshalled to the the client process. The time that it takes to dereference the extra pointer for the BSTR* is trivial compared to the process context switch or the network latency that is involved in marshallig the data.
Basically what it boils down to is the fact that you should use a normal variable type for input parameters, and pointers to the data type for output parameters.
If you use a pointer for input parameters, that is one extra check that needs to be made in order to guarentee that the pointer is valid, when this check does not have to be made when the value is input.
Because there is no pass by reference in COM, the only other way to return a value through a parameter is through a pointer.
|
|
|
|
|
Another point Nish:
[out] parameter should always be a pointer
Mazy
"So,so you think you can tell,
Heaven from Hell,
Blue skies from pain,...
How I wish,how I wish you were here." Wish You Were Here-Pink Floyd-1975
|
|
|
|
|
Hi codegurus there.
I am doing some network programming using MFC these days. I have two application, one is server, one is client. For server, I make it an un-blocking one using WSAAsyncSelect, and specify to respond to the following network event:
FD_READ | FD_WRITE | FD_ACCEPT | FD_CLOSE
At the client end, it's simple. I have three menu item, one is open_connection, one is close_connection, the other is send_receive. Here's part of my code for client:
OnConnectionClose()
{ shutdown(mysocket, SD_SEND);
closesocket(mysocket);
}
OnConnectionOpen()
{ mysocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(mysocket, (LPSOCKADDR)&saServer, sizeof(saServer));
}
OnSendReceive()
{ send(mysocket, szBuf, strlen(szBuf),0);
recv(mysocket, szBuf, sizeof(szBuf), 0);
}
And at server end, I respond to the network event like this:
OnNetWorkEvent(WPARAM wParam, LPARAM lParam)
{
switch(WSASELECTEVENT(lParam)
{
case FD_CLOSE:
closesocket(wParam);
TRACE("FD_CLOSE received\n");
break;
case FD_ACCEPT:
... ...
}
}
the problem here is: on client end, if I do "open_connection", then "close_connection", the server end will receive the FD_CLOSE event. But if I do "open_connection", "send_receive", then "close_connection", the server end will not receive the FD_CLOSE event. All other events are handled correctly. Could anybody tell me what's wrong with my coding?
Thank you all very much in advance!
|
|
|
|
|
FD_CLOSE will only be notified when there's no more data to read (you can think of it as the EOF after reading all data from a file). So it is possible that your server app is not consuming all the pending input and thus gets never notified about FD_CLOSE .
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Thank you very much for the hint!
One more question, When my client call connect(), the server will be notified by FD_ACCEPT event. This is cool. But right after that, the server will be notified by a FD_WRITE event. Why?
|
|
|
|
|
FD_WRITE is notified (for a particular socket) whenever the socket is able to accept data for output. So:- If you are calling
accept on the FD_ACCEPT handler, it is not only legal but indeed expected that you receive an FD_WRITE right after that.
- If you are not calling
accept on the FD_ACCEPT handler, then the behavior you're observing is weird. If you'd like to learn more about Winsock programming, Warren Young maintains an excellent Winsock Programmer's FAQ.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
thank you a lot! I am checking the FAQ out..
|
|
|
|
|
Hi all,
I have WinXP on my system ...
I could run all 3d programs before i install VS.NET ...
When i installed VS .NET then now i can't run any 3d programs because my computer hangs !!!
What is wrong ?
My month article: Game programming by DirectX by Lan Mader.
Please visit in: www.geocities.com/hadi_rezaie/index.html
Hadi Rezaie
|
|
|
|
|
Maybe VS.NET installed a different version of DirectX?
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Hi again, thanks for reply ...
hmmm yes, maybe ...
But how can i solve it ?
Is there any way ?
(I don't think so )
My month article: Game programming by DirectX by Lan Mader.
Please visit in: www.geocities.com/hadi_rezaie/index.html
Hadi Rezaie
|
|
|
|
|
I have some code that uses SHBrowseForFolder() to let the user browse for a folder. The problem is, if the user selects a folder but later needs to select a different folder, i can't make it default back to the previously selected folder. There must be some simple way to do this, right?
farewell goodnight last one out turn out the lights Smashing Pumpkins, Tales of a Scorched Earth
|
|
|
|
|
There must be some simple way to do this, right?
There is a way, but it's anything except simple. Fortunately, Kenneth M. Reed wrote a MFC Wrapper for SHBrowseForFolder which does the hard job for you.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
This looks like it should work. Thanks!
farewell goodnight last one out turn out the lights Smashing Pumpkins, Tales of a Scorched Earth
|
|
|
|
|
SHBrowseForFolder lets you use a callback function. In your callback, handle the BFFM_INITIALIZED notification and set the initial selection. See BrowseCallbackProc in MSDN for more info.
--Mike--
Fetchez la vache!
My really out-of-date homepage
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan and Jamie Salé.
|
|
|
|
|
|
Wow fancy!
Thanks man, this is exactly what i need!
farewell goodnight last one out turn out the lights Smashing Pumpkins, Tales of a Scorched Earth
|
|
|
|
|
I have a tcp connection to a server that works with text commands and uses '\n' as the delimiter. Unfortunately, the packets get torn into pieces or they get stuck together quite often (as in any tcp connection) so i can't just parse one packet at a time. I'd like to know how i can handle it so i can keep receiving data untill i hit the delimiter and store that into a string, parse it and continue receiving the rest of the packet and perhaps some data of the next packet untill another delimiter shows up. If anyone knows a tutorial about this or knows how to do this, please help.
(I'm using asynchronous mode)
Thanks.
Kuniva
--------------------------------------------
God gave man a penis and a brain but not enough blood to make both of 'em work at the same time.
|
|
|
|
|
This same problem got posted yesterday or two days ago. You have two options:- When a new line is to be read, keep reading while
'\n' is not found and stuffing all the input to a temporary buffer (in your case an std::string would fit nice). When the end of line is found, return the complete line and keep the last part of what you read (i.e. the part after '\n' ) in that temporary buffer for the next read operation. A little convoluted, but not hard to program.
- For each line written, send before a variable (say an
unsigned long ) specifying how many bytes the line has. Upon reading, you just have to read the size information first to make then an additional read operation for the exact amount of data needed. This requires that you are in control of the sending part, and poses some crossplatform compatibility problems (that can be fixed, nevertheless).
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
I have imported a project developed in VC++ 6.0.
and am getting this(these) errors when running
C:\\windows\system32\ntdll.dll , cannot find or open a required DBG file
C:\\windows\system32\mfc70.dll , cannot find or open a required DBG file
How do I fix these?
Thanks -JoeSox
|
|
|
|
|
mfc70.dll is the MFC version from Visual Studio .NET (not 6.0), I think. Oops, I misread your question, sorry.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
How do you put that line Joaquin?
Mazy
"So,so you think you can tell,
Heaven from Hell,
Blue skies from pain,...
How I wish,how I wish you were here." Wish You Were Here-Pink Floyd-1975
|
|
|
|
|
enclose the paragraph you want to overline just like this:
<p style="text-decoration:line-through">This shouldn't have been written</p>
This shouldn't have been written
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Thanks
Ooops,thanks
Mazy
"So,so you think you can tell,
Heaven from Hell,
Blue skies from pain,...
How I wish,how I wish you were here." Wish You Were Here-Pink Floyd-1975
|
|
|
|
|