I'm new to Windows COM programming. I was able to make a 64-bit app call a 32-bit COM server (out-of-process, exe) on 64-bit Vista, but not the other way around, the CoCreateInstance call in my 32-bit app failed with a return code 0x80029C4A (error loading type library/DLL).
Can this be done at all? Basically I just need the 32-bit app to send some request to the 64-bit server, and wait for the request to finish. The server should be able to send back a status code indicating whether there is any error.
Looking for an easy way or infact any way to pop event for unmanaged code via csharp com interop wrapper.....
Any one knows a good site for c# COM technologies? I have a serious trouble with this issue....
I'm not sure if I'm posting in the correct forum, this is regarding late binding on a custom DLL in C#.
Basically, I have a self-written DLL which I wrapped using TLBIMP.exe.
Now I am trying to map the DLL's events to that of my own form. The events inside the DLL originate from a class.
I have tried almost every solution I was able to Google and nothing works.
Please do not reply to my thread if you have just Googled a solution, I need to hear from someone who has done this before. I've tried Google.
O.k, I'm going to use simpler names than that of my actual code.
My DLL file is called wrapper_MyDLL.dll and I load it as follows:
I'using COM and the IWebbrowser interface in a non MFC C++ application to have a preview on MS Office documents (doc, docx, xls, ...) in a frame of my application. Works quite fine, but I'm facing two problems, which I was not able to solve yet (though working on it for 2 weeks... ).
1. I have installed IE8 and MS Office 2007. When I'm showing a Word file (.doc), then all the Word toolbars are shown and active. When I'm showing an Excel file (.xls) with the same Navigate command, all the Excel toolbars are hidden. I want these toolbars generally to be hidden. I've tried several things with the "FullScreen", "TheaterMode" and "Toolbar" commands, but these things don't seem to work with this interface !?
I have also tried the OLE command ExecWB with w->iexp->ExecWB(OLECMDID_HIDETOOLBARS, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
This works fine, but unfortunately this is a toggle command. So I may only execute this command, if the toolbars are already shown, but I found no way to determine whether the toolbars are already shown.
Of course, I could check if I'm showing a Word file, and only then I will hide the toolbars. But I really don't like this extension depending behaviour. So does anyone have an idea to generally hide these toolbars? Or is there a possibility to change some flags in MS Word and MS Excel?
2. Is there a possibility to get to know whether a Word document is modified in my application frame? The problem is: Someone could write something to the Word file in my application window. If he then just closes the window, these modifications are lost. The "normal" MS office dialog, which asks whether you want to save your modifications or not, or just cancel, is not coming, while closing the window. I guess my window is already destroyed before this dialog has a chance to come, so I have to show my own dialog for asking before the window is destroyed. And therefore I need to know if the file has been modified.
I have already installed an event listener via the connection points technique to get the WebBrowserEvents, but I didn't find an event which is good for my needs.
Does anyone have an idea?
Thanks in advance
P.S. I'm a newbie to these COM things, so please be patient with me
IWebBrowser interface notifies the window some events, such as DocumentComplete, NavigateComplete, BeforeNavigate, DownloadComplete etc. 'DocumentComplete' will be notified when a document is completely loaded into browser. Then you can get a IDispatch pointer to the loaded document by calling IWebBrowser::get_Documet(). In the case of Word, you will get IDispatch pointer to the _Document interface of Object Model of MS Word Application. See Object Model of MS Word by opening it's type library (MSWORD.OLB) using OLEView.exe tool of Visual Studio. _Document has methods put_Saved() & get_Saved(). You can create wrapper classes for the required interfaces of that Object model.
following is the rough code..
IDispatch *pDsip = 0;
_Document wordDoc(pDisp); //_Document is the wrapper for _Document interface
//Call wordDoc.Save to save document
Investigate on Word interfaces to do something to hide tool bar.. Its possible.
I have an interface, I1 declared in library A, another interface I2 in library B. I2 has a property whose type is I1.
Now I want to use I2 in project A, so I "#import 'B.tlb' rename_namespace('B'), named_guids", then compile failed with error C4772, for interface I1 that in B.tlh can not be indentified. How to resolve this problem?
Thanks for your suggestion, but it does not work. Because I have not write code using I2, if I comment the import clause, project A can be compiled well. But if I add import clause, compiled with error C4772.
1. add an item to the context menu from a right click in the background of a folder in explorer (not a right click ON a folder)
2. add an item to the context menu from a right click on an exe file
First question is... can I do this with ONE shell extension or does it have to be two separate modules? I'm really hoping I can do it all at once.
Secondly, I'm wondering what the best way to "package" a shell extension is (for easy installation later). Right now the DLL is being accessed from my project folder but that is just a temporary solution. I need to install it somewhere....where should it live and what's the best way to get it there? Should I create an installer of some sort?
You could do that with one or two extensions. IShellExtInit::Initialize() is called with different parameters when you click on a file versus the background, so you can tell those two cases apart. Check out part 1[^] and part 7[^] of my shell extension series for more details.
Having two extensions doesn't mean you need two DLLs. Each extension is just a coclass, and there's nothing preventing you from having multiple coclasses in one DLL.
Thanks Mike! I figured this was possible so I'll keep working on it. I've looked at your part7 tutorial, and you created two separate classes that derive from IShellExtInit, so I'll need to do this as well, right? It seems like I'll need one to handle right clicking on a file, and one to handle right clicking in the background. I don't see how else IShellExtInit::QueryContextMenu can differentiate.
In the case where you right-click files, Initialize() gets an IDataObject* that contains the list of selected items. In the case where you right-click the background, Initialize() gets a PIDL that tells you the folder.
Is there any way to get the instance of EXCEL.EXE from Process ID using COM?
Similar to GetActiveObject, is there any other thing through which we can get the instances of multiple EXCEL.EXE running in Task Manager?
After getting handle to each EXCEL.EXE, I want to track all workbooks and sheets. I am using EXCEL automation to do this using C++. Getting all workbooks and sheets is done. But after getting PID of EXCEL.exe's , how to get that object?
I am getting PID for each process using psapi.h.
I think I am not asking a question, which I am not supposed to or I shouldn't ask.
In C#.net we have BinkToMoniker to get the object. Is there any such thing in C++(unmanaged).