|
Jörgen Sigvardsson wrote:
But still, knowing C++ doesn't do you any harm to fully understand COM.
???
Tech.Support : Mam, is your pc running under windows?
Customer : No actually its close to the main door.
|
|
|
|
|
COM evolved from C++ virtual table pointers. If you already understand the vtable concept in C++, you can often skip the first 2-3 chapters in a COM-book, and you don't have to give "the interface concept" a second thought as it's as natural as air.
--
<british-accent>Pass the jam, would you?
|
|
|
|
|
Thanks to nice articles on the site I was able to get my COM project going nicely. I decided to do this without ATL/MFC as my needs are quite basic and I really want to understand what I'm doing. I'm not saying ATL/MFC are bad, I've worked with MFC for years so this really isn't about what's good and what's bad, I just chose this approach and try to live with my decision.
Enough of introduction, here's the problem. Being new to COM, I'm having some problems in adding support for every interface required by Internet Explorer to use it. IDispatch and invoke seem to work nicely, but do I need something more?
Do I need to mark the component safe for scripting if I sign the code?
Also, I need some interoperability with another ActiveX component, namely Macromedia Flash. I'd be happy to handle this via javascript functions, but how do I retrieve the scripting host and is there a solution which would work on other browsers than IE?
|
|
|
|
|
If all you need is to invoke few methods in your component, then there is no need to implement other interfaces, IDispatch is enough (although ISupportErroInfo could be useful for error reporting)
Whether to mark it "safe for scripting" or not is up to you. If you won't, the IE behavour will depend on IE security setting "SCript ActiveX controls marked safe for scripting" : "disable", "prompt", "enable"
Edward
|
|
|
|
|
Hi Folks,
If I declare an object tag with a class ID, I get statement completion in Interdev. If I use a ProgID I don't
I'd rather use PROGID's - any way around this?
Davy
My Personal Blog - Homepage. Scottish News - Angus Blog, Perth Blog and Dundee Blog
|
|
|
|
|
I've written a Word automation appilcation in C#, and I'd like to capture the OnClose Event....I know thats not the name but I don't know what else to cal it. Basically I open an instance of word and open a document, if the user tries to close the word window I'd like to create a small question dialog box, and thoughts ?
|
|
|
|
|
I'm developing a ActiveX in MFC Visual C++ 6.0 (Not ATL) and I have a serius problem and I can't find documentation in books or Internet.
How can I save a CArray into the persistence of a ActiveX????? (I mean in a PX_Blob function)
A Thousand Thanks.
Diego
|
|
|
|
|
Serialize it to a CArchive ?
You'd be better off asking in the Visual C++ forum.
|
|
|
|
|
Yes Serialize to a CArchive and the pass the handle (HGLOBAL) of that archive to the PX_Blob.
And of course recover that CArray later.
Thanks.
|
|
|
|
|
Hi,
I am currently using Visual Studio version 6.0 for C++/MFC development and I want to move to the new IDE Visual Studio .NET and continue learning COM and ATL C++ developlment.
QUESTION
Can I develop regular COM/ATL C++ code using the new VS.NET? I should say that I am new to COM programming so I don't want to make things more difficult.
So my question is really - I would like to continue the same C++/MFC/COM/ATL coding but using the new compiler and IDE. Is that possible, without too much grief?
Thanks
Mike
|
|
|
|
|
|
any 1 can help me what and when __uuidof is used in com
when i used it with _CommandBarButtonEvents when creating an add in for outlook 2000 it generated error "this class have no uuid associated with it" . but in ole object viewer i can see its uuid.
|
|
|
|
|
can u write those lines of code whih u r using to get __uuidof ur event interface.
Abhishek Srivastava
Software Engineer (VC++)
India ,Noida
Mobile no 9891492921
|
|
|
|
|
__uuidof keyword extract guid assigned to an object via "uuid" attribute ((__declspec(uuid"...")). It's not always assigned. Usually headers generated by midl or "import" statement have such attibutes attached to the objects (interfaces, enums)
Check your header file that has a declaration of _CommandBarButtonEvents
Edward
|
|
|
|
|
Got a problem, exhausted all of my ideas:
I have an MFC / ATL-com-server project. Upon final release, I want the COM object to wait for a timer to fire one last time and run it's thread to completion before unloading itself. Here are some attempts:
1) AddRef() in the com object and then once the timer thread has fired it's last time, Release() from that thread. This causes a crash in the main window of the app in CWnd::DestrowWindow function with this code:
if (pWnd != NULL)
{
#ifdef _DEBUG
ASSERT(pMap->LookupPermanent(hWndOrig) == NULL);
#endif
}
2) In the CSSLogCOM::InternalRelease() function (which I've overridden), wait for a flag to be set when the timer thread fires and completes with while(bWait) Sleep(1000); . This doesn't work because the timer won't fire once we're in this function! ???
3) I would try to post a WM_QUIT message to the main window, but the ATL server can host many copies of the same COM object in a single instance and if one of them posts the quit message, other running instances will be stopped early.
Anyone have any idea how I can "delay" the final release of a COM object from closing the ATL server until my worker thread has completed?
Thanks
~Steve
|
|
|
|
|
How about using CreateEvent/SetEvent/WaitForSingleObject/SignalObjectAndWait?
Create two events before the worker starts, one called "StopNow" and "DidStop". Let the worker thread do it's thing, periodically checking the "StopNow" event with WaitForSingleObject. When your server is about to terminate, make it use the function SignalObjectAndWait. This'll set the "StopNow" event, thus triggering the worker thread. It'll also make the server wait for the "DidStop" event. Meanwhile, the thread exits gracefully, but before finally quitting, it sets the event "DidStop", which will give the main thread clearance to continue termination.
void OnTerminate() {
SignalObjectAndWait(hStopNow, hDidStop, INFINITE, FALSE);
...
}
void ThreadProc() {
while(...) {
...
if(WaitForSingleObject(hStopNow, 0)) {
SetEvent(hDidStop);
}
}
}
--
Seraphim Shock. Gold for your ears.
|
|
|
|
|
Thanks for the tip, and the example code. Looks promising, I'll give it a go...
~Steve
|
|
|
|
|
I want to convert HTML to TEXT from some string
It good works in VB code like this:
Dim body As String
Dim hd As HTMLDocument
Dim str As String
Set hd = New HTMLDocument
Open "c:\test\a.html" For Input As #1
body = Input(4188, #1)
hd.body.innerHTML = body
Debug.Print hd.body.outerText
I try do it with VC++ so:
IHTMLDocument2 *pHtmlDoc = NULL;
HRESULT hr;
hr = CoCreateInstance(CLSID_HTMLDocument,
NULL,
CLSCTX_INPROC_SERVER,
IID_IHTMLDocument2,
(LPVOID *) &pHtmlDoc);
IHTMLElement *pBody;
hr = pHtmlDoc->createElement(CComBSTR("BODY"), &pBody);
CComBSTR bsText;
hr = pBody->get_outerHTML(&bsText); // OK, we have ""
CComBSTR SomeText("Some Text);
hr = pBody->put_outerHTML((BSTR)SomeText); // ;-( falls
It falls down while "put_outerHTML"
Who know right solution?
PS
Set hd = New HTMLDocument
creates an object with html code with base document structure (5 tags: html, body, head, title, p).
CoCreateInstance creates absolutely empty object.
Why?
================================
My products are here
|
|
|
|
|
Sorry don't have time to check it myself, but should work: you can try to query for IPersistStreamInit, and then call IPersistStreamInit::InitNew, that should initialize the html document object
Edward
|
|
|
|
|
Does anybody know how to fill the fields of IE's web page
from within VB or C++ ? What if the page is secure? Of
course, there is no problem to fill all the fields by
hand. The question is how to do it automatically, by
running .exe or .dll.
|
|
|
|
|
|
Hello,
I am confused about the Marshalling. When is it needed actulaly ??.....(when we want to run an out of procees server)... thats what i know. But cant we like run an Exe server without the marshalling support. I think i have seen some source code which makes an exe server (nothing else i mean no proxy/stub implementation is there ... no DLL). And you can invoke it from the client. This suggests that u can make an Exe server without Marhalling support is that true ? kindly clear me about this ...
Thank you
|
|
|
|
|
Marshalling is always required when calling between different execution contexts. This can include calling between components in a single-threaded apartment and a multi-threaded apartment (e.g. if the calling thread in the executable called CoInitialize , OleInitialize or CoInitializeEx with the COINIT_APARTMENTTHREADED flag, and the component in the DLL is registered with ThreadingModel = Free). Marshalling is always required on a cross-process or cross-machine call.
Marshalling is the process of converting the call parameters into a suitable in-memory or network representation in order for the RPC library to transfer the call across the execution boundary. When received on the other side, unmarshalling is the process of converting back from the in-memory or network representation into a procedure call. The return value and any output parameters are then marshalled back to the caller.
COM looks in the registry on a per-IID basis to locate proxy/stub implementations. You can find them under HKEY_CLASSES_ROOT\Interface\{IID}\ProxyStubClsid32.
There are two cases in which you don't need to supply a proxy/stub implementation. The first is where you're only using standard interfaces, or interfaces defined by a third party. These should already be registered. If you only use IDispatch (Object in VB 6), you don't need a marshaller.
The second is where you're using only Automation-compatible types. For these, you can use the Automation marshaller, which uses the type library to marshal parameters. You must register the type library for this to work, by calling RegisterTypeLib .
The Automation marshaller goes by the name of PSOAInterface, and has a CLSID of {00020424-0000-0000-C000-000000000046}.
|
|
|
|
|
Hmmm Great Reply,
No wonder i was getting interface not supported when i tried to RUN my Exe Server, while the exapmle code that i saw worked(as it supported the standard interfaces ..and therfore had no proxy/stub implementation) ..... Thanks that was a great reply...it helped me a lot. Code Project is great ... i have learnt a lot from these forms specially.
One thing more. To my knowledge using midl tool u can do marshalling easily for custom interfaces ....... i have made the interface in MIDL and compiled it, it gives me a lot of files .... I guess u have to get a dll out of it somehow ........ which u have to register under the proxy/stub in registery...plz correct me if i am wrong
Thank you
|
|
|
|
|
Usually (depend on midl options) you'll need xx_p.c file (proxy stup), xx_i.c (interface defs), dlldata.c
If you use atl/com wizard it generates makefile for proxy stub: dllxxx.mk
Edward
|
|
|
|