|
Utilize the OLEVIEW tool. OLEVIEW has an Explorer-like browser.
1. Open Object Classes - All Objects and attempt to find your COM server which probably will be listed by Prog ID. This assumes that your COM server is registered of course.
2. Open Type Libraries - To attempt to view the type library. This assumes that there is a type library and the type lib is registered.
Note that both attempts may require some insightfull searching but visits to OLEVIEW typically prove to be fruitful.
Typically (but not always) type libraries are embedded in com server modules. VBers only need to add a reference to the typelibrary via a browser in there IDE. The would need to know the library name or the location of the exe,dll,exe,tlb file. C++ people may obtain type-lib info, including headers for compilation, by using the #import directive. See your local MSDN for more information.
Example
#import "C:\Program Files\JMPS\bin\JmpsFramework.tlb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
Note that this will generate JmpsFramework.tlh in my build directory.
Note that some COM servers do not has tlbs - they use standard marshalling or may be a simple com server that does not intend to marshall such as a simple learning exercise.
beamsack
|
|
|
|
|
The last line in your mail is of importance to me. I am using a COM server which does not have a tlb. Its using custom interfaces.
Can I use such a server using Automation clients like VB? If so, how?
In C#, in order to use a COM Component, the precondition is that it should have either a tlb or the server should carry this information within itself.
Only then, C# can create an assembly for this.
But since in my case I neither have a tlb, nor does the com server carries such information, I am unable to use it directly in C#.
Can you please look into it.
Thanks in advance
Rais
|
|
|
|
|
Rais,
I would say that you must have a type library in order to use the COM server. I believe standard marshalling is limited to C++. Header inforation is generated with the proxy/stub code. VB would have no idea of the types you would wish to use. I don't think automation will work without a tlb - you can test the possibility by creating a windows scripting host file and
Object myServer = _ <br />
CreateObject("MyProg.Identifier")<br />
myServer.MyMethodIHopeToCall You must have a proxy/stub dll if you don't have a type library. It may even work because typically marshalling is not required for inproc COM servers, but the OS may place your server in a "delegate process". Therefore it is highly recommended that some type of type library or proxy stub dll exist.
|
|
|
|
|
Hi,
I have an STL string pair (using a map) and every value is unique (just like the keys are unique). Sometimes, I need to "flip" the keys and the values, so the keys would become the values and the values become the keys.
Is there a built-in function that would allow me to do this without having to create a new map and do this through a loop?
Thanks!
|
|
|
|
|
Hi Chris,
I happen to be in the process of writing an STL-like bidirectional map, i.e. one for which you can lookup by key and by value. As my workload does not allow me to finish the thing, it'll be quite a while till I finally get to post it to CP. Nevertheless, if you're curious I can send to you what I have right now (it's already pretty functional, and beta testers are always great ).
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
I've been looking for this for several years now. At one point I was going to write one myself, but I'm not a stl guru. Please email me this if you can at drescherjm@hotmail.com
Thanks,
John M. Drescher
|
|
|
|
|
I am looking forward to such an article. In my applications I have been using two maps depending on what keys I needed. I am also intereseted in becoming your beta tester of course .
Best regards,
Alexandru Savescu
|
|
|
|
|
Chris Hambleton wrote:
Is there a built-in function that would allow me to do this without having to create a new map and do this through a loop?
Nope. A map is normally a red-black tree implementation, so by swapping a key-value pair, you've essentially invalidated the location of that node in the tree.
You can always remove the key-value pair first and then add the swapped values back in the tree. (More overhead, less memory usage of course.)
Brandon
|
|
|
|
|
Humm, perhaps you could use a multimap, since insertion and remotion from the multimap doesn't invalidate the iterator(if I'm not mistaken here).
Cheers,
Joao Vaz
A Programming Language is a tool that has profound influence on our thinking habits -The late giant Edsger Dijkstra 1930 - 2002
And if your dream is to care for your family, to put food on the table, to provide them with an education and a good home, then maybe suffering through an endless, pointless, boring job will seem to have purpose. And you will realize how even a rock can change the world, simply by remaining obstinately stationary. -
|
|
|
|
|
Well, until Joaquin bidirectional map comes out I suggest you use two maps and use one of them depending on what the keys are. This is what I have been doing.
Best regards,
Alexandru Savescu
|
|
|
|
|
Why not store as the value both they value and the key
struct
{
int key;
int value;
} KeyValuePair;
std::map<int, KeyValuePair> mymap;
Then you can search through the map (although not as fast) by eithe the key or value.
Todd Smith
|
|
|
|
|
You can already do a linear search for values. Why add the key to the data set?
--
Please state the nature of your medical emergency.
|
|
|
|
|
You can always to this:
template <typename key_t, typename value_t>
class bidir_map {
typedef map<key_t, value_t> key_to_value_map;
typedef map<value_t, key_t> value_to_key_map;
key_to_value_map key_map;
value_to_key_map value_map;
};
Although, this may not be the most efficient implementation in terms of size. But if your collections is small, then this may be a cheap solution.
--
Please state the nature of your medical emergency.
|
|
|
|
|
Hello guys,
I have an ATL project with a COM object called IJeremy it has a method called SetMsg which takes an IMessage* as an [in] param.
This object fails to compile - it tells me:
error MIDL2025 : syntax error : expecting a type specification near "IMessage"
What is the best way around to get it to work?
I have tried importing CDOSys.Idl from my IDL, however it does not compile because of many errors.
Has anyone done this before?
Thanks for the help,
Jeremy
Jeremy Pullicino
Professional C++ Developer
Done any hacking lately?
|
|
|
|
|
Have you tried inserting a forward declaration for IMessage ?
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Yes, I did that, however, I get another error when I do that.
error MIDL2011 : unresolved type declaration : IMessage [ Parameter 'pIMessage' of Procedure 'Submit' ( Interface 'ISubmitMsg2' ) ]
'Submit' is my method
'ISubmitMsg2' is my interface
Thanks,
Jeremy.
Jeremy Pullicino
Professional C++ Developer
Done any hacking lately?
|
|
|
|
|
Try moving the forward declaration of IMessage into the library block where ISubmitMsg2 is defined.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Jeremy Pullicino wrote:
I have an ATL project with a COM object called IJeremy it has a method called SetMsg which takes an IMessage* as an [in] param.
Why not pass the IUnknown* I/F and requery back for IMessage* I/F?
|
|
|
|
|
Bill S wrote:
Why not pass the IUnknown* I/F and requery back for IMessage* I/F?
I am currently doing that
I would like to manage to get an IMessage* through however...
Jeremy.
Jeremy Pullicino
Professional C++ Developer
Done any hacking lately?
|
|
|
|
|
Jeremy Pullicino wrote:
I would like to manage to get an IMessage* through however...
I assume that IMessage I/F is your own custom interface. You will have to import the interface definition file that provides the marshalling definition for this interface. This is created when compiling the IDL file that contains the IMessage I/F definition. Give it a try.
Best Regards,
|
|
|
|
|
Jeremy,
Try making your "in" look like this
[in]BSTR param
make sure you change the prototype in header file to reflect this change and update the function on the CPP file also.
let me know if this helps
in your code after you get the message that the container is returning to you, you will need to do something like this:
STDMETHODIMP CJeremy::SetMsg(BSTR param)
{
USES_CONVERSION;
LPSTR lpParam = W2A(param);
::MessageBox(NULL, lpParam, "Title", MB_OK);
return S_OK;
}
or very close to that in order to read the .
Tom Wright
tawright915@yahoo.com
|
|
|
|
|
How can I catch a fired COM event in an ATL based NT/win2k service?
I have found only examples of clients written in VB or MFC.
Alma.
|
|
|
|
|
|
|
Hi, everyone!
Look at the source codes,
--------
/* #define WIN32 */
#ifdef WIN32
#define MORECORE wsbrk
#endif
--------
Such is the comments,
--------
WIN32 (default: undefined)
Define this on MS win (95, nt) platforms to compile in sbrk emulation.
--------
I have two questions,
1. What means WIN32? When the variable "WIN32" becomes
defined? When it is not defined?
2. What means "sbrk" in the comment? What means "wsbrk"?
Btw: the software is written for both Windows and Linux
platforms.
Cheers,
George
|
|
|
|