|
Thanks CPallini,
But can't we include the complex type definition in IDL and build the IDL into typelib and let client use the typelib?
regards,
George
|
|
|
|
|
AFAIK automation clients don't use typelib s.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Sorry my bad, CPallini. I always write C++ native client actually.
If the automation client (I think you mean client like VB or JScript) does not use typelib, what will they use to invoke? Just read some document about interface/coclass/methods signature information and use GUID or ProgID, then call IDispatch.invoke?
regards,
George
|
|
|
|
|
Yes, VBScript clients, for instance, do something like this.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Thanks CPallini,
Sorry we are talking about two things.
I mean VB -- Visual Basic. Any way, here are my questions, let us talk VB and script language (VB Script or JScript) separately.
1. Could VB client use TLB file?
2. Could script client use TLB file?
3. If I define customized type (e.g. a structure) in IDL file, use such customized type as input parameter or return type for some methods, and generate related TLB. Could VB client use such methods?
4. If I define customized type (e.g. a structure) in IDL file, use such customized type as input parameter or return type for some methods, and generate related TLB. Could script client use such methods?
regards,
George
|
|
|
|
|
George_George wrote: I mean VB -- Visual Basic. Any way, here are my questions, let us talk VB and script language (VB Script or JScript) separately.
I suppose 'VB' standing for 'Visual Basic 6' .
George_George wrote: 1. Could VB client use TLB file?
AFAIK Yes.
George_George wrote: 2. Could script client use TLB file?
Nope.
George_George wrote: 3. If I define customized type (e.g. a structure) in IDL file, use such customized type as input parameter or return type for some methods, and generate related TLB. Could VB client use such methods?
I don't know.
George_George wrote: 4. If I define customized type (e.g. a structure) in IDL file, use such customized type as input parameter or return type for some methods, and generate related TLB. Could script client use such methods?
Nope.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Thanks CPallini!
For item 4, you mean for script client, if I define customized type (e.g. a structure) in IDL file, use such customized type as input parameter or return type for some methods, and generate related TLB. Script client can not use such methods? I feel surprised so confirm here again.
regards,
George
|
|
|
|
|
Scripts client use only VARIANT datatype only via IDispatch .
Of course, you know, this is going on my arrogant...
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Thanks CPallini,
I did some search but find no results. Do you have any documents referrals which describes whether script language could use TLB or not?
regards,
George
|
|
|
|
|
Oh, well no. But I'm pretty sure: VBScript & JScript (I'm not talkingt about the .NET one) have only VARIANT datatype and can only access COM components via IDispatch .
You may have a look to VBScript or JScript reference documentation on MSDN .
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
|
Thanks Sandip,
I am a little losting the context you are talking about. Do you mean in order to implement a dual interface,
- we need an additional customized interface, which implements IDispatch?
- or we need implement both an additional customized interface (and the customized interface inherits from IUnknown) and also implement IDispatch?
- or both the above two ways are fine?
regards,
George
|
|
|
|
|
SandipG wrote: I think things shoudl be clear after this.
ROTFLMAO! This must be your first reply to George!
led mike
|
|
|
|
|
Steve Echols wrote: Been so long since I've done it, I'm a bit fuzzy on the details.
Yep, that's it, and that pretty much is the detail.
led mike
|
|
|
|
|
Thanks led mike,
As you are here. Let me just rate your reply and ask you a question.
To implement dual interface is easy, i.e. making the component implement a customized interface, and making the customized interface inherits IDispatch. So, I think since it is easy, every COM component should implement it and be a dual interface. Why implementing dual interface is not mandatory -- i.e. for some other reasons, developer will not implement dual interface?
regards,
George
|
|
|
|
|
I've been writing a TCP/IP client program: C++, Winsock, Win32, multithreaded. Anyway, after I send a message or two and a subsequent receive, I then get a 10053 from Winsock. Windows XP. I am completely updated with MS so it isn't an old system dll. I checked their knowledge base and there's nothing that I haven't done - there isn't much anyway. What really kills me is that other TCP/IP programs: web browsers, email clients, FTP clients, etc... are operating fine. Is there some sort of trick that I am missing?
To reiterate, it works perfectly for at least one 'send' and 'recv'. The client is communicating with Apache.
Any ideas? (What's left of my hair is falling out over this!)
I've also removed my anti-virus and turned off my firewall to see if that will clear it up - it didn't.
modified on Friday, September 12, 2008 5:03 AM
|
|
|
|
|
10053 WSAECONNABORTED
An established connection was aborted by the software in your host machine.
LitteWindow wrote: Any ideas?
Yes - you're doing something wrong.
What does your send and receive code look like?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Here's me receive************************
void TWinsock::receiveDataFromServer(string& sDataBuffer )
{
int iResult = 0;
int bytesReceived = 0;
char buffer[ERRORBUFFERLEN];
char receiveBuffer[RECEIVEBUFFERLEN]; // Needed for the C to C++
// Clear out any junk out of the receive buffer .....
memset(receiveBuffer,NULL,RECEIVEBUFFERLEN);
// Make sure the data buffer is empty....
sDataBuffer = "";
// Receive data until the server closes the connection
do {
iResult = recv(ConnectSocket, receiveBuffer, RECEIVEBUFFERLEN, 0);
if( iResult > 0 ){
bytesReceived = iResult;
string temp(receiveBuffer);
sDataBuffer += temp;
#ifdef _DEBUG
// cout << "So far recv'd ....\r\n" << temp << endl;
#endif
}
else if ( iResult == 0 ){
// isConnected = false;
// throw EWinsockException (WSAGetLastError(), "Connection closed\n" );
}
else{
sprintf_s(buffer, "recv failed: %d\n", WSAGetLastError());
throw EWinsockException ( WSAGetLastError(), string(buffer) );
}
} while( iResult > 0 );
// Move it to the passed variable
sDataBuffer = receiveBuffer;
}
Here's the send***************************************************
void TWinsock::sendDataToServer(string sDataBuffer )
{
int iResult;
char buffer[ERRORBUFFERLEN];
if( isConnected )
{
// Send an initial buffer
iResult = send( ConnectSocket, sDataBuffer.c_str(), sDataBuffer.length(), 0 );
if (iResult == SOCKET_ERROR) {
sprintf_s(buffer, "send failed: %d\n", WSAGetLastError());
closesocket(ConnectSocket);
isConnected = false;
WSACleanup();
throw EWinsockException ( WSAGetLastError(), string(buffer) );
}
}
else{
throw EWinsockException ( string("Socket not connected.") );
}
}
|
|
|
|
|
You should start by properly handling the send() and recv()
return values.
A successful recv() may get you all the bytes you requested or
just one byte. You need to call recv() until you get the
number of bytes requested.
Same with send(). A single send() call may send anywhere from 0
to the number of bytes you want to send. You need to account for
that as well.
It's interesting that you send variable length data but receive
a constant number of bytes...how do you keep that in sync?
What happens if RECEIVEBUFFERLEN is > or < the number of bytes sent?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
The send: It's just a string of not more than a 200 bytes - for this one. I have another one that will chunk up a file to send but I haven't tested that one.
The recv: I have a while loop that will keep pulling off data (while( iResult > 0 )) while the return code from recv is greater than 0.
That's not good enough for Winsock? It would be surprising since these methods are basically the MS examples. I just OOP'd them.
|
|
|
|
|
LitteWindow wrote: That's not good enough for Winsock?
Sure, but the code you showed isn't correct and doesn't implement any
working protocol. That's the only code I have to work with.
LitteWindow wrote: I have a while loop that will keep pulling off data (while( iResult > 0 )) while the return code from recv is greater than 0.
Are the sockets in blocking mode?
How do you recv the proper number of bytes?
Also, you should be able to debug it live pretty easily.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Are the sockets in blocking mode? I think so. Whatever the default mode of Winsock is. How do you recv the proper number of bytes? If I haven't answered this - I loop until the recv returns something less than or equal to 0. Sorry, I'm a bit tired and I forget what I answered before and for some reason this site is really slow for me right now. Also, you should be able to debug it live pretty easily. Yes. I'm in Visual C++ Express and when I debug, everything looks fine. I haven't seen anything really weird happening in the debug windows. So, I'm really confused. Oh, before I forget - even if you can't give me a solution, thanks for giving me some things to think about.
|
|
|
|
|
LitteWindow wrote: I loop until the recv returns something less than or equal to 0
Then recvs will only happen until there's no more data sent.
Then recv will block until there's more data.
If you run in the debugger, break execution and see where the
receive thread is sitting. In the call to recv()?
You're using HTTP protocol? If so...
Are you parsing the reply properly?
Are you relying on the receive loop to end when the
connection is closed by the server? If so are you using
the appropriate keep-alive header?
Too many questions?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Sending this to server ....
POST /index.txt HTTP/1.1
Host: 192.168.1.105
Connection: Keep-Alive, TE
TE: trailers, deflate, gzip, compress
User-Agent: Gallery Remote 1.5
Accept-Encoding: text/*, text/html, text/html;level=1, */*
qewr
The returned message is ->
HTTP/1.1 200 OK
Date: Sat, 13 Sep 2008 13:13:26 GMT
Server: Apache/2.2.9 (Fedora)
Last-Modified: Thu, 28 Aug 2008 01:36:16 GMT
ETag: "595979-2d-4557b29b66400"
Accept-Ranges: bytes
Content-Length: 45
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/plain; charset=UTF-8
|
|
|
|
|
All that HTTP protocol stuff has to be parsed properly
to recv the expected number of bytes. Are you doing that?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|