I'm automating MS Word and so far I've found out that the easiest way to do it is to put as much of the code as possible in VBA macros (in a *.dot file loaded through COM automation), and call those macros.
The problem is I can't pass arguments to MyMacro1, and I need to in some cases. CApplication::Run accepts only 1 parameter and that's the macro name. But how can I pass additional arguments to the macro?
There is sufficient light for those who desire to see, and there is sufficient darkness for those of a contrary disposition.
I am trying to call an activeX method from JScript in IE6. The method we are trying to call takes two arguments: one long which is the dimension of the array (of bytes) passed as the second parameter. In some cases the size can be zero and the array undefined and we are in that case.
How can I call this method from my JScript code? I tried obj."method(0, null);" but I get an incompatible type error. I also tried using Scripting.Dictionary object but to no avail. Has anyone a tip for this ?
I'm building .NET application that uses DirectX API for web camera device rendering.
I'm using DirectShowNet Library as wrapper for more info see here DirectShow.NET[^]
When I create instance of for ICaptureGraphBuilder2 interface and call RenderStream like bellow
where capFilter is my source filter,everything is OK.
But after releasing the resources and recreating the graph and the ICaptureGraphBuilder2 instance when I call the method RenderStream it failes with return code -2147024809 or HRESULT E_INVALIDARG.I've tried to call it like
,where target is my target filter,but this failes again with the same return code.When I change the category to PinCategory.Preview I'm also getting the same result.
I can't avoid using ICaptureGraphBuilder2,because I need to control the resolution of the device.
Do you know how to fix it?
Thank you very much!
working with some closed-code client/server application - the client reaches the server using a COM object thats defined by a InprocServer32 DLL - I would like to split client and server to different machines.
DCOM at first sight cannot do it - as the COM is a InprocServer32 DLL (for remoting a LocalServer32 COM - EXE seems to be necessary - Racmgr32 only lists these COM class entries).
My first thought was to code a InprocServer32 COM EXE that provides the same classes like the InprocServer32 DLL does. After I would generate the TLB of the DLL an generate a InprocServer32 DLL that has the same classes and interfaces, but just calls the LocalServer32 EXE - which after could be remotely used by help of DCOM. I guess this has do be done because if I just deleted the InprocServer32 class entry, the current creating method in my client-EXE would not be able to deal with the LocalServer32 COM class anymore.
My question now is - would You guys do it the same way? Does anyone know a way how to make a InprocServer32 DLL being usable remotely - for example by hooking up CreateDispatch? If I would do it the way I described - does anyone see problems or shortcomings? I am thankful for every articles and informations You drop!
Thank You very much for Your ideas, thoughts and replies!
A good online reference for COM programming is: Inside COM+[^], it covers alot of the same information as does Don Box's "Essential COM".
After reading your post several times (I found it a little confusing), I'm wondering: what your logic is for wanting to have your COM objects remoted from another machine, to a Local out-of-process server, and then to an in-process DLL server? Is this some kind of security scheme, or is it just not understanding the basic architecture of COM?
Also, this wasn't clear from your post: are you writing all three COM components yourself? Or, is the InprocServer32 DLL already compiled, and is a dependency for your client project?
An In-Proc server ALWAYS must be a DLL. The COM Library uses the registry entries for the COM CoClass along with the parameters the client provides when instantiating, using either CoCreateInstanceEx, or DllGetClassObject, as the case may be, to determine exactly how to configure the COM Server. It's actually more complicated than that.
Here are some of the relavant chapters from the above cited book: Chapter Two, The Client, CoCreateInstanceEx[^] Chapter Four: Apartments[^] Chapter Thirteen, Executable Components[^] Chapter Fifteen, Standard Marshaling[^]
And, of course, the one aspect of COM that mystifies everyone, Chapter Eighteen, Security[^] Chapter Ninteen, The Network Protocol[^], is also very informative.
In answer to your original question, though, I would start out configuring my COM server to be as simple as possible, unless you have overriding security concerns. If you read Chapter Thirteen, you will see that much of the reason for creating an Out-of-Process Server instead of an In-Proc Server, is to control the actual number of COM objects being accessed simultaneously by separate client applications.
thank You for all that useful information - I am sure these links will push my project forward.
As I re-read my article, I agree with You that it's not written that clear - so I'd like to explain it more straight:
A company that quit business a while ago sold us some server application together with a client and an API to also write Your own clients to that server. All programs are compiled and I have no source - the only thing I got is a very detailed API documentation, a InProc32 COM DLL and it's includes for C++ projects. All was provided for use with Visual C++ 6.0.
The current situation is, that the server app runs together with the provided client app on workstation machines, and at night a client appwritten by me (using their API) queries the data and stores it in a central server with raid structure.
The provided server app accepts as many connections as I want (through the API-DLL-COM-Inproc32). Our bottleneck is currently the sync of all databases at night, we would like this to happen realtime. Instead of doing syncs several times a day, I would like to split the provided client and server from running together on one workstation. After the client should run on the desktop PC till API inproc32. There I would like to put sth. in between to lead the API calls through DCOM or TCP to a RAID server running the provided server app that would respond.
------------- Server -------------------------------------------
| DCOM -> ActiveX-Exe -> Inproc32-DLL -> Server app
As I got no sources, I would create a fake Inproc32 COM DLL from the original API's ILD file.
Then a ActiveX exe providing DCOM support encapsulation the Inproc32 DLL running on server machine.
Now the fake Inproc32 DLL would forward through DCOM to that ActiveX-Exe-DCOM provider which would do the real calls to Inproc32-real-API-DLL on our RAID-server.
Again in other words:
What I try to do is split on a known COM-Inproc32-API and put client app and server app on different machines. Problem is - I got a ready-to-use client app that I cannot modify (compiled) and a server app that is compiled, too.
The question remaining is - is there a more elegant way without the need to writing a ActiveX-Exe that provides the COM-class of the inproc32-API for DCOM on the server machine - and a kind of fake/proxy DLL that forwards to this DCOM-ActiveX-Exe from client machines (to leave all clients-apps loading their Inproc32 DLL)? All is just for splitting server app and client app to different machines...
Let me add that we already verified - there is no license problem by doing what I try to.
Thank You very much for all Your support - I am reading the articles already!
(I'm assuming you have a sense of humor.)
See, now that second post makes it all clear,...and, by the way, I would never have suspected all that from your original post, except that you were leaving out some important details. WOW!
This sounds like something right out of SWORDFISH (2001 movie)[^]. Had you actually posted that last post originally, my response would have been:
DYH 6GJY!! BGOOC265RTG, HEY DFWQAQ!! LL8U YHJ IIRFDB, OK POQQVC47. !W! KKL: FGTMVX KPSSV QQFYHC!! 4547.0058875
(Warning, this repsonse is encrytped. By Extra-Terrestrials. It just looks like gibberish!)
OK, all kidding aside,...why would you even run this software? You have NO IDEA what it really does. Always require that the source code be availiable. Otherwise, how do you verify it's operation? What are your security requirements? I'm assuming there aren't any.
I REALLY don't know what to suggest. To me, the entire concept is implausible. I would start over and write the entire component suite from the beginning, so that I had the complete source, so that I could (1) configure diagnostic routines, if necessary, and (2) verify that it operates correctly and securily, or, can be conveniently upgraded.
I'm writing an application where I automate word. When the user saves the document, I need to also export it to a different format, so I have to somehow be notified when the user is saving, preferably before any saving has started.
When I read the codeguru article they said that the events listed there - Startup, Quit, DocumentChange, New, Open, Close are the only events that can be captured (at least for word97 for which the article was written), and Save is not among them.
The microsoft article also seems to be written for Word2000 and above, but I would like to support also Word97.
There might be an easier way, though - using VBA macros. I found out about that while googling to find more info about the problem. It works like this - if you create a macro named FileSave this macro gets executed *instead* of the normal File->Save operation. Likewise for FileSaveAs. I tested that and it really works, I already created a *.dot file which contains those macros, and that works in Word97, too.
But there's a catch - I don't know how to load the macros in the *.dot file through automation. Do you have any ideas about that?
There is sufficient light for those who desire to see, and there is sufficient darkness for those of a contrary disposition.
i'm listing database records in grid my application environment is asp.net with C# and oracle database.after open the record,i have to implement the page navigation inside the page.i'm searching from long time how to provide the navigation to previous/next pages which are available in grid.(i.e in gmail inside the email right upper corner of email one link will be there displays the selected email num - total email count and hyperlinks along with that to navigate.based on our click on tht link it would be show the page either previous/next with out going back to inbox).how to implement this feature with out hitting the database.can u provide any sample.
I am using the WIA 2.0 library in VB.NET to scan documents through the document feeder. I have been researching for hours just trying to figure out how to make the scanner use the document feeder instead of the glass. Could anybody please help me here. I found out that I should change the property 3088 (which is WIA_DPS_DOCUMENT_HANDLING_SELECT) to 1 instead of 2.
1 being for feeder and 2 being for flatbed. However, when I do a transfer my Canon MX330 still attempts to use the flatbed. Can anybody give me some direction here? Thanks for your time and help in advance.
I got into the problem where I have to inherit a COM class/object with another COM class/object. Actually I am creating a component for for reading/writting CAD entities so I have many entities with common properties so, for all the general properties I have to write the property functions in each COM class which is just duplication of code so, I just wanted to create a template base class that will have the set of properties & using which I can make the code reusable.
Structure of my component is as follows Document has Entites has Entity information
Please suggest me what to do in this situation.
There is no future lies in any job but future lies in the person who holds the job
I have gotten to the point in my code where I have a variant type 8204 (which may be a safearray of bstr's??) Having researched lots of stuff on safearrays and VT_ARRAY, I'm still stuck on how to access this.
ptrRS = wr->GetData(); // returns a record set of rows from a table
_variant_t vtRows = ptrRS->GetRows(adGetRowsRest);
int vt = vtRows.vt;
str3.Format("vt %d", vt);
MessageBox(str3); // displays 8204
How do I index through vtRows and extract each of the bstr to a say CString?
I'hv a BHO built in VC6(ATL/COM) which is needed to create a toolbar button and on buton click i need to use the api UrlDownloadtoFile which is need to download a file to a specific location and called webbrowser.navigate to make it navigate to a specific file
Com works fine in XP but it problem started when it is used in Vista
are these API not supported in Vista or there a updated set of SDK which is need to downloaded to make it work
i have read the inks regarding the Protected Mode Restriction and some other articles related to Intergrity level in Vista but still can't find the solution.
settings for phishing filter and enabled add-ons but still of no use.
BHO dosen't work in either Protected Mode "ON/OFF"
plz Reply if there is a solution(if possible for Protected Mode OFF firstly)