|
...the caller's local object is now the accepted client socket?
No. In Java, primitive types (int s, float s) are passed by value, anything else (objects whose type begin with a capital letter, if you want a mnemonic) is passed as if with a hidden pointer. In your particular case, picturing a '*' at appropriate places will help you realize TheClientSocket won't hold the newly accepted socket on return:
public boolean receiveAndUnmarshallInvoke(CRmiInvokeMessage * InvokeMessage,
ServerSocket * ListenSocket, Socket * TheClientSocket)
{
boolean success = false;
if(TheSocket == null)
{
System.err.println("Null TheSocket passed in CRmiCommunicator.receiveAndUnmarshallInvoke().");
}
else
{
TheClientSocket = ListenSocket.accept();
}
return success;
}
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Thanks Joaquin. So in the code I posted, when the function returns, the new socket object created by ListenSocket.accept() will be deleted once the TheClientSocket local reference (?) variable goes out of scope, correct?
I guess then the only way to implement this would be to go "return TheClientSocket" instead of the boolean, and pass it back to the caller in that manner?
Thanks,
swine
Check out Aephid Photokeeper, the powerful digital
photo album solution at www.aephid.com.
|
|
|
|
|
Thanks Joaquin. So in the code I posted, when the function returns, the new socket object created by ListenSocket.accept() will be deleted once the TheClientSocket local reference (?) variable goes out of scope, correct?
No, it'll be deleted when the garbage collector decides to sweep it off. Whether the socket itself, as a system resource, gets released, depends on the Finalize method of Socket (I think).
I guess then the only way to implement this would be to go "return TheClientSocket" instead of the boolean, and pass it back to the caller in that manner?
This is a way. Another is to have a wrapper class around Socket and pass this to the function:
class SocketWrapper
{
SocketWrapper(Socket socket_)
{
socket=socket_;
}
public Socket socket;
}
...
public boolean receiveAndUnmarshallInvoke(CRmiInvokeMessage InvokeMessage,
ServerSocket ListenSocket, SocketWrapper TheClientSocket)
{
boolean success = false;
if(TheSocket == null)
{
System.err.println("Null TheSocket passed in CRmiCommunicator.receiveAndUnmarshallInvoke().");
}
else
{
TheClientSocket.socket = ListenSocket.accept();
}
return success;
}
...
Socket clientSocket;
receiveAndUnmarshallInvoke(...,new SocketWrapper(clientSocket));
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Lol that is really really weird. Are you sure it works that way? So I have to make a whole separate class just to pass a pointer back?
Also.... do I have to explicitly call Finalize() on Socket objects? I thought perhaps it all "just gets taken care of" with the garbage collector... No?
Much thanks,
swine
Check out Aephid Photokeeper, the powerful digital
photo album solution at www.aephid.com.
|
|
|
|
|
Lol that is really really weird. Are you sure it works that way? So I have to make a whole separate class just to pass a pointer back?
I'm sure. This is how things are in Java. The idiom seems a little strange at first, but Java programmers are used to it. C# provides references to handle this problem, I think (I'm no expert in either language).
Also.... do I have to explicitly call Finalize() on Socket objects? I thought perhaps it all "just gets taken care of" with the garbage collector... No?
You should never call Finalize yourself, this is done by the garbage collector. Java docs are not specific about this, but my hunch is that Socket.Finalize actually closes the socket (you might want to ask on some Java forum, they'll surely know).
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Finilize is used by java, at it's turn it calls the close method of a socket. It's done so, so an port is always closed when the class has no reference anymore,and is garbage collected. However, it's far better to use the close method yourself.
LPCTSTR Dutch = TEXT("Double Dutch ");
|
|
|
|
|
ok i got it! check it out, a java implentation of a c++ pointer!
public class CPointer<br />
{<br />
public CPointer()<br />
{<br />
m_TargetObject = null;<br />
}<br />
<br />
public CPointer(Object TargetObject)<br />
{<br />
m_TargetObject = TargetObject;<br />
}<br />
<br />
public void nullIt()<br />
{<br />
m_TargetObject = null;<br />
}<br />
<br />
public boolean isNull()<br />
{<br />
boolean isNullResult = false;<br />
<br />
if(m_TargetObject == null)<br />
{<br />
isNullResult = true;<br />
}<br />
<br />
return isNullResult;<br />
}<br />
<br />
public void pointAt(Object TargetObject)<br />
{<br />
m_TargetObject = TargetObject;<br />
}<br />
<br />
public Object unwrap()<br />
{<br />
return m_TargetObject;<br />
}<br />
<br />
private Object m_TargetObject;<br />
}<br />
so we just need to go:
public boolean receiveAndUnmarshallInvoke(CRmiInvokeMessage InvokeMessage,<br />
ServerSocket ListenSocket, CPointer ReturnedClientSocketPointer)<br />
{<br />
boolean success = false;<br />
<br />
if(ListenSocket == null)<br />
{<br />
System.err.println("Null ListenSocket passed in CRmiCommunicator.receiveAndUnmarshallInvoke().");<br />
}<br />
else<br />
{<br />
try<br />
{<br />
Socket TheClientSocket = ListenSocket.accept();<br />
<br />
<br />
ReturnedClientSocketPointer.pointAt(TheClientSocket);<br />
}<br />
catch (Exception e) <br />
{<br />
System.err.println("Socket failure (" + e.getLocalizedMessage()<br />
+ ") in CRmiCommunicator.receiveAndUnmarshallInvoke().");<br />
}<br />
}<br />
<br />
return success;<br />
}<br />
<br />
Check out Aephid Photokeeper, the powerful digital
photo album solution at www.aephid.com.
|
|
|
|
|
In Java everything is a reference. If you have two objects a and b and you
do:
a = b then a references the same data as b, so modifying a will modify b as well.
Best regards,
Alexandru Savescu
P.S. Interested in art? Visit this!
|
|
|
|
|
In Java:
Definitions:
void PassInAConstantReference(final Object o)
{ }
void PassInAModifiableReference(Object o)
{ }
void PassInACopy(Object o)
{ }
Calls:
Object o = new SomeObject();
PassInAConstantReference(o);
PassInAModifiableReference(o);
PassInACopy(o.clone());
Regards,
Alvaro
Well done is better than well said. -- Benjamin Franklin
(I actually prefer medium-well.)
|
|
|
|
|
ahhh! thanks!
what about the c++ equivalent of:
<br />
boolean isEmpty(void)const;<br />
I don't think the following works in Java:
<br />
boolean isEmpty() final<br />
{<br />
}<br />
swine
Check out Aephid Photokeeper, the powerful digital
photo album solution at www.aephid.com.
|
|
|
|
|
How can I detect when the mouse cursor hovers over the system tray icon for my application? TrackMouseEvent() doesn't actually handle this since the application is a background process, since there's really no visible handle to give to it... Anyone know how to detect this?
Thanks!
|
|
|
|
|
I write a programe(with VC6).It run correctly at computer with ONE cpu(Win2000 server).But It can not run with TWO CPUs .
For my develop envirment is ONE cpu,so I can not locate the error correctly.
can you tell me the possible reason.
How can i locate the error?
thanks in advance.
liuty
|
|
|
|
|
Are you using threads ? I'd imagine that would be a likely error source, not being threadsafe.
Christian
No offense, but I don't really want to encourage the creation of another VB developer. - Larry Antram 22 Oct 2002
Hey, at least Logo had, at it's inception, a mechanical turtle. VB has always lacked even that... - Shog9 04-09-2002
Again, you can screw up a C/C++ program just as easily as a VB program. OK, maybe not as easily, but it's certainly doable. - Jamie Nordmeyer - 15-Nov-2002
|
|
|
|
|
yes!I use threads.
How to do with "being threadsafe".
what I would pay special attention to, when i write programe?
|
|
|
|
|
liuty2006 wrote:
what I would pay special attention to, when i write programe?
Any data that is written by more than one thread should be wrapped in a critical section, or similar, to ensure atomic access.
Christian
No offense, but I don't really want to encourage the creation of another VB developer. - Larry Antram 22 Oct 2002
Hey, at least Logo had, at it's inception, a mechanical turtle. VB has always lacked even that... - Shog9 04-09-2002
Again, you can screw up a C/C++ program just as easily as a VB program. OK, maybe not as easily, but it's certainly doable. - Jamie Nordmeyer - 15-Nov-2002
|
|
|
|
|
Hi, I need to trigger my OnEraseBkgnd() (not OnPaint()). What would be the appropriate way, PostMessage(WM_ERASEBKGND) ?
|
|
|
|
|
Invalidate(TRUE) triggers both, but if you want one and not the other, I guess you could try ::PostMessage.
Christian
No offense, but I don't really want to encourage the creation of another VB developer. - Larry Antram 22 Oct 2002
Hey, at least Logo had, at it's inception, a mechanical turtle. VB has always lacked even that... - Shog9 04-09-2002
Again, you can screw up a C/C++ program just as easily as a VB program. OK, maybe not as easily, but it's certainly doable. - Jamie Nordmeyer - 15-Nov-2002
|
|
|
|
|
hmmm, Invalidate() is want I want to avoid and PostMessage() requires a pointer to a HDC. I need a background repaint only, perhaps a combination of RedrawWindow() arguments?
someone can help?
|
|
|
|
|
Aren't there methods that generate a HDC for your windows client area ? If not, you could set up a flag in your WM_PAINT handler so that it does nothing when m_bSkipPaint is true, for example.
m_bSkip = true;
Invalidate(TRUE);
m_bSkip = false;
Christian
No offense, but I don't really want to encourage the creation of another VB developer. - Larry Antram 22 Oct 2002
Hey, at least Logo had, at it's inception, a mechanical turtle. VB has always lacked even that... - Shog9 04-09-2002
Again, you can screw up a C/C++ program just as easily as a VB program. OK, maybe not as easily, but it's certainly doable. - Jamie Nordmeyer - 15-Nov-2002
|
|
|
|
|
Christian Graus wrote:
Aren't there methods that generate a HDC for your windows client area ?
that would be great... how?
I tried this code, but didn't work:
<br />
CClientDC dc(this);<br />
PostMessage(WM_ERASEBKGND, (WPARAM) dc.m_hDC, 0);<br />
|
|
|
|
|
Anonymous wrote:
I tried this code, but didn't work:
CClientDC dc(this);
PostMessage(WM_ERASEBKGND, (WPARAM) dc.m_hDC, 0);
but at the same time, this code works:
<br />
CClientDC dc(this);<br />
OnEraseBkgnd(&dc);<br />
|
|
|
|
|
When my application starts up, I would like it not to create a new document, but I would like it to open ones if it is specified on the command line. How do I do that?
Tx
Michel
It is a lovely language, but it takes a very long time to say anything in it, because we do not say anything in it, unless it is worth taking a very long time to say, and to listen to.
- TreeBeard
|
|
|
|
|
In your application object InitInstance() method, there will probably be some lines like:
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
ProcessShellCommand(cmdInfo);
The default action with no command line parameters is to open a new file, but you can change this easily by inserting the following code between the parse and the process:
if ( CCommandLineInfo::FileNew == cmdInfo.m_nShellCommand )
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
Dave
|
|
|
|
|
Tx for the info, it works great!
Michel
It is a lovely language, but it takes a very long time to say anything in it, because we do not say anything in it, unless it is worth taking a very long time to say, and to listen to.
- TreeBeard
|
|
|
|
|
I have created an application that host browser control.
My problem is that IWebBrowser::get_HWND is return E_FAIL.
I want get_HWND function to return my application's window handle.
YK.
|
|
|
|
|