|
What do you mean pass them to C++?
What do you plan to acheive with your objects?
|
|
|
|
|
You can use IDispatch* ,LPDISPATCH or IDispatchPtr (smart pointer created from import)
to pass IDispatch pointers to your C++ methods.
Kindest regards
Holger Persch
|
|
|
|
|
I have created a procedure in my ATL Component which returns IDispatch *
In VB Client Its also allocated to an object but at the end of VB function i got an error in VB
Help me
|
|
|
|
|
How can i use existing COM components , for eg if i want a text component then how should
i go about doing it ? are there any components whose interfaces can be used directly ?
parag
|
|
|
|
|
How can I load Activex component from .ocx file? I don't want to use
insert new object dialog. Do I have to make some changes to component
itself? Thanks for help allready
|
|
|
|
|
Just #import the typelib and go about creating component the usual way with CoCreateInstance()
Hush..Hush.. thought I heard you calling my name now...
|
|
|
|
|
I built a COM object and installed it in MTS. I'm referencing to it in an ASP page and in that page I need to loop through its properties without hardcoding them. With ADO object I can do this
DIM prop
FOR EACH prop IN <object name="">.properties
...
NEXT
But when I tried this with the COM object that I've built, the ".properties" is not a option.
So is there a way to loop into the collection of properties with a custom COM object ? Do I have to toggle an option or to add a reference in the object ?
Pat
|
|
|
|
|
Is properties a property or method that you've added to the COM object! if not take a look on MSDN for TLBINF32.DLL it's a COm object that will let you iterate through an object properties/methods.
Joe.B.
|
|
|
|
|
Hi all !
Explain this question who is able to
16. You design a COM component for use by many user interface applications in your company. One of the interface methods for the component defines a parameter for an IP address as a string in the format nnn.nnn.nnn.nnn. The component's type library defines this parameter as both an input and an output parameter.
When the interface method is called, the component validates the IP address. If the current user is forbidden to access that address, then the component should change the parameter to the string 0.0.0.0 and display this string within the application.
Which type of COM component should you design?
A. data-aware class
B. distributed COM server component
C. out-of-process COM server component
D. ActiveX user interface Control
Thanks.
|
|
|
|
|
Hi ......
I have a composite control with some buttons on it, I want them
to react on me pressing enter. I tried to overload the pretranslatormethod and
catch it, but the funny thing is that it only works randomly, sometimes it works and
sometimes it doesnt. Have you come across anything like that before ? I cant solve it
/Pierre
|
|
|
|
|
Hi ......
I have a composite control with some buttons on it, I want them
to react on me pressing enter. I tried to overload the pretranslatormethod and
catch it, but the funny thing is that it only works randomly, sometimes it works and
sometimes it doesnt. Have you come across anything like that before ? I cant solve it
/Pierre
|
|
|
|
|
Hi,
VB stores some data about connections points it exports in the linked thread's TLS, thus when I try to callback an event, I get an Acces Violation. I found a code snippet by microsoft, but it doesn't seem to work in all cases, and event worse, didn't allow me to transfer interfaces ...
Thank you
|
|
|
|
|
I recently installed the Platform SDK, and suddenly started getting linker errors on GetObjectContext on codes that were previously running OK. When I looked through the Platform SDK sample codes, and the recent samples on .NET (FMStocks7 GAM - Business Logic Layer), I noticed that GetObjectContext is still being used. I noticed the documentation says you should use COM+. What is going on. I have a lot of code that uses GetObjectContext function, and that could break if I re-compile.
When I compile with VC++ 6.0 SP3 without the Platform SDK, I do not get the errors. The code was originally written using SP3, I have recently installed SP5.
Thanks
Gaul
gaulles@worldnet.att.net
|
|
|
|
|
I have a question about "Inside COM" by Dale Rogerson.
In aggregation part of Chapter 9
HRESULT __stdcall CA::Init()
{
IUnknown* pUnknownOuter = this ;
HRESULT hr =
::CoCreateInstance(CLSID_Component2,
pUnknownOuter,
CLSCTX_INPROC_SERVER,
IID_IUnknown, (void**)&m_pUnknownInner) ;
if (FAILED(hr))
{
return E_FAIL ;
}
hr = m_pUnknownInner->QueryInterface(IID_IY,
(void**)&m_pIY) ; if (FAILED(hr))
{
m_pUnknownInner->Release() ;
m_pUnknownInner = NULL ;
m_pIY = NULL ; // Just to be safe
return E_FAIL ;
}
pUnknownOuter->Release() ;
return S_OK ;
}
From above, I don't understand the following part.
hr = m_pUnknownInner->QueryInterface(IID_IY,
(void**)&m_pIY) ;
I guess delegating QI of Inner Component will call QI
of Outer Component and it should call Nondelegating QI
of Inner Component.
How come the following is calling Nondelegating QI?
HRESULT __stdcall CA::QueryInterface(const IID& iid,
void** ppv)
{
else if (iid == IID_IY)
{
// You can query for the interface.
return m_pUnknownInner->QueryInterface(iid,ppv) ;
}
....
Thanks,
|
|
|
|
|
Hey there,
I believe CA::QI -is- calling the non-delegating query: m_pUnknownInner is a pointer to the non-delegating version of IUnknown. When an aggregatable object is created, the new object will return the non-delegating IUnknown: this is the one and only time that an object will return the non-delegating interface, rather than the "usual" delegating interface, when IUnknown is requested. This is why the aggregating parent object -must- query for the IUnknown interface when it's calling CoCreateInstance() for the child object: if it didn't ask for IUnknown at create-time, then it would never be able to get the non-delegating interface....
Note there's certainly other ways of doing aggregation, too: take a look at Don Box's method in Essential COM, too....
-andrew
|
|
|
|
|
Hello...
I appreciate your reply.
I think I didn't get the Cast part when it
creats the inner component.
After I got that, your answer got crystal clear ^^
I will definately take a look at Essential COM.
Thanks
|
|
|
|
|
HELP! I followed instructions given in Microsoft on-line help Article ID Q173974 for adding MFC support to an ATL EXE Project but I get the following build errors in the CServiceModule:
error C2660: 'Init' : function does not take 2 parameters
error C2065: 'IDR_ServerS2B' : undeclared identifier
error C2660: 'UnregisterServer' : function does not take 1 parameters
error C2660: 'RegisterServer' : function does not take 1 parameters
error C2039: 'StartMonitor' : is not a member of 'CServiceModule'
error C2065: 'dwPause' : undeclared identifier
|
|
|
|
|
I *appear* to have run into a limitation (or perhaps a bug?) in the #Import statement used to import a type library in Visual C++. Since I can find no documentation on this, I was hopeing that one of you might be able to shed some light on my problem.
Imagine that I have two projects. One automation server, and one client.
1) The Automation server
The server is defined by an .idl file containing several (dual) interfaces (around 20). Among all those interfaces I have a total of 499 functions defined.
2) The Automation client
The client uses the #import statement to import the type library (.tlb) created by the server.
At this point, everthing works fine. The #import <.tlb> runs smoothly and the client can access and use the functionality of the server without a problem.
Now... If I add another function to the server (function 500) suddenly the client refuses to compile.
I've determined that the problem is not simply a syntax problem. It appears to me, that the #import directive has a fixed limit of 499 functions that it can handle before it chokes. Can anyone confirm this?
Looking at the client-generated implementation files (*.tlh and *.tli), I find that the output generated for the two different versions (499 functions vs. 500 functions) is quite different. The *.tlh file for the 499 function version (the one that works) contains an #include statement at the bottom to include the *.tli file. In the 500 function version, the #include is replaced by:
#pragma start_map_region(<*.tli file and path>)
__declspec(implementation_key(1)) short <function1> ( );
__declspec(implementation_key(1)) short <function2> ( );
... // functions 3 to 498 excluded for brevity
__declspec(implementation_key(1)) short <function499> ( );
__declspec(implementation_key(1)) short <function500> ( );
I'm willing to entertaint the argument that I simply should not ever create (much less import) a type library containing 500+ functions. However, I would still like to find out what the story is with this, if only to satisfy my curiosity.
Also, I can find no documentation on either the "#pragma start_map_region" or "__declspec(implementation_key())" statements. (I know what #pragma and __declspec are . Can anyone tell me what these are and what they do?
Thank you.
|
|
|
|
|
Maybe this link can help...
http://support.microsoft.com/support/kb/articles/Q170/9/89.ASP
HTH
Jignesh
|
|
|
|
|
Dear all,
When the client calls the member function of the interface in the exe server,the following assert is displayed in the dialog .
"The value of ESP was not properly saved across a function call .
This is usually a result of calling a function declared with one calling convention with
a function pointer declared with a different calling convention
chkesp.c
line:42"
I don't know how to solve the problem .Could anyone help me?
Thanks a lot
|
|
|
|
|
ESP is the stack pointer register E stands for 32 bit (as opposed to the 16 bit pointer on the 80286 many years ago.
The error message is usually correct, but sometimes something really bad happened like you whacked something on your stack (buffer overrun), and sometimes you can get this message by stepping over code in the debugger using "set net statement".
If you know that you haven't been writing to memory off the end of an array thats a stack variable, take a look at the Docs on "calling convetions". what typically happens in these cases is that you have 2 funtion prototypes that declare the function to have differing calling convetions. You need to make sure that the person who implements the function agrees with the person who calls the function as to things like where function arguments are passed on the stack or in registers, etc.
int f,r,a,c,t,A,l=42;main(){while(--l>-42)for(t=-60;t++<20;putch('J'-f))for(A=a=r=f=0;++f<42&&r*r+A*A<7056;c=r+t,a=l+A,r=(c*c-a*a)/42,A=c*a/21);}
|
|
|
|
|
I am developing a product on COM and i want to have a seperate dll which provides error handling features.
The existing existing framwork consists of one dll and the exception handling is carried out in the same dll using atlreporterror() and the customised HRESULTS are generated using MAKE_HRESULT.I want to have a seperate dll which is to be implemented using Monikers.My idea is to store all the product specific error codes in a table in the database and my error handling api should retrieve the appropriate error messages from that.
My question is whether it is useful to build such a framework using IMoniker or you have any suggestions for me regarding this?
praveen
|
|
|
|
|
Hello all,
I’ve been trying to get my mind around the following issue in COM: The use of the [dual] parameter when defining interfaces. I’ve read all (....well a lot of) the text on it, but haven’t really found my answer.
Let me tell you what *I* understand (correct me if I’m wrong):
1. dispinterfaces are the same as interfaces inherited from IDispatch.
2. Interfaces derived from IDispatch use Invoke to call methods, while IUnknown derived interfaces use VTables.
3. Using [dual] makes an interface able to use both VTable and Invoke.
....so here comes the problem.
If I define an interface (IDispatch derived and NOT using [dual]) and defined it as a [source] in a coclass then VB is happy to see the events. Yippie! If I use the [dual] parameter on that interface then VB does not like me and won’t see the events?
So my first question is WHY DOES VB not see the events if it is marked as [dual]? Secondly WHY would one ever really use the [dual] parameter….I don’t see where it is useful?
Anyway….any (helpful) comments would be appreciated!
D.
|
|
|
|
|
Hey Daniel,
I'll try and help with what I understand about disp and dual interfaces.
1. Disp interfaces are not derived from IDispatch, they are IDispatch. The automation client will only be aware of the disp interface, and this wil be the only means of communication between automation clients and your object.
2. Disp interfaces will use invoke to call methods of your object, and they will use GetIDsofNames to discover at run time the methods and properties exposed through the IDispatch interface. IDispatch is in fact derived from IUnknown, however, as are all COM interfaces. So, you are in fact using a VTable if you use IDispatch, but you are using a VTable to the IDispatch methods, not the specific methods of your interface (IMyObject or whatever).
3. Using dual means that your object will implement an IDispatch interface as well as a custom interface. Methods of your object will be available both through the IDispatch interface and through its custom interface. Methods accessed through the custom interface will be accessible directly through the interface pointer (VTable), while methods accessed through the IDispatch will have to be accessed through the slower Invoke method of IDispatch. The invoke method basically just imposes the same signature on all of the methods of your object by packaging all parameters to the method in a variant array. So you lose speed with the dispatch, and also sacrifice a little bit of type safety, in that it's no longer possible to check the parameters to a method at compile time, so it's possible to send the wrong number and types of arguments to a call to IDispatch::Invoke, and get a return value of E_INVALIDARG. A single interface does not use both invoke and a direct VTable. The IDispatch interface exposed by your object implements the Invoke, etc., while the custom interface(s) expose whatever methods they wish though the VTable.
Event source interfaces are pure disp interfaces by convention, not dual or custom. The event source interface should be a separate disp interface. Note that this is an outgoing interface, so this means that the event interface is published by your object, but the methods are implemented by the object that wishes to receive the events. When your object fires an event, it is actually calling a method of the source interface implemented on the receiving object. You may implement multiple event sources on a single object, but I think usually one is probably enough.
Using a dual interface allows C++ or other custom clients the ability to access the faster custom interface of your object, while at the same time allowing automation clients the ability to use your object through its dispatch interface (things like VBScript). When you use the dual interface, there's no extra work required on your part to support IDispatch, so it's basically for free. If your object will never be used through an IDispatch interface, there is no benefit to using dual interfaces, but they offer the most flexibility and portability.
I hope that helps.
|
|
|
|
|
I want to be able to embed a text file into a rich edit control when the operator drags a file into the control. At the moment it appears that a link is inserted into the rich edit control rather than the file itself. This means if the original file is deleted the copy of the file in the rich edit control cannot be edited. Can anybody point me at an example of how to do this. I have got as far as implementing the callback interface so that I know when a file is being dropped but I dont know where to go from there. I have tried looking through MSDN but I have been unable to find a good explanation of how the facilty works.
Thanks for any help you can provide.
Steve.
|
|
|
|