I have this method which creates a CDialog containing controls / info about DirectShow filter. I would like to access the dialog and use the controls to adjust the filter properties. I posted this in DiectShow forum and getting nowhere.
I have no clue how to do this.
Any help would be greatly appreciated. Cheers Vaclav
If you want to modify gui elements programmatically then it is a big hack that may or may not work on other machines. Even if we know how to do this magic we don't know what you want to do and we can't read your mind to find it out. It is possible to traverse the window/child control hierarchy and if you can identify certain controls then you can manipulate them. Often identifying the controls is possible by their/their parents' Z order and/or control ID. Depending on what you want to do different kind of hacks/functions may be necessary.
EDIT: as a first step you should write a function that prints out the full window hierarchy of your dialog along with some extra info with each child control window (like hwnd value, control id, classname). Use the GetWindow() function to traverse the window (tree) hierarchy. At the same time you should check the properties of the child controls you want to manipulate with Spy++. This way you can find the location of a control in the hierarchy and write the code that somehow programmatically retrieves the necessary HWNDs from the hierarchy for you. When you are done you will have to manipulate the gui controls by calling windows functions and sending messages to the HWND of the given control.
EDIT: Here is a piece of code that prints you the tree you can view with Spy++. This small piece of code contains a few function calls that can come handy when its about getting the HWND of a specified child control in the gui hierarchy:
Thanks, it's a start. BTW this is not "for hire" project and as long as it works for me I am happy. I am busy learning about COM because I feel the "interface array" may be used to accomplish this. But right now it is way over my head. Personally I am puzzled why MS published this method if it just for show, but there are other DirectShow applications pretty much same style - half-baked. But I like your Spy approach. Thanks Vaclav
You are welcome. I have no clue about directshow. If there is a nice "official" method to adjust settings (that I doubt if you couldn't get help on a specialized forum) then do it that way instead of hacking around with HWNDs. Sometimes however the hack is the only solution. If the program is not a production release (for example a temporary throw away helper tool, or an in-house tool) then its quite okay to go with hacky "working" solutions. In-house you can restrict directshow versions (like we restrict browser versions compatible with our in-house web-interfaces). If you want to release it to the wild to be used with a lot of windows/directshow versions then its more dangerous, you cant test your hack with all windows/directshow versions...
Been doing some research and found this interface IPropertyPageSite which may work. So far no luck finding a usage of it. There my be another way to do it but I would have to replace the modal dialog with modeles. There was KB article on that but it is gone. Thanks MS. Vaclav
If you want to use integer arithmetic without floating point then do it this way:
unsigned__int64 size = 524285686;
constunsigned MEG = 1024*1024;
unsigned megs = (unsigned)(size / MEG);
// If you want 3 digits in the fraction then change 100 to 1000 and change %02u to %03u in the format string.
unsigned fraction = (unsigned)((size % MEG) * 100u / MEG);
printf("%u.%02u\n", megs, fraction);
EDIT: changed from signed integers to unsigned integers
I want to develop a DLL that has a web browser embedded in it. In the past i have created MFC dialog app using CDHtmlDialog. With that experience what i want to achieve is create a DLL that has browser embedded in it, and then load this DLL into a web browser like IE, Chrome or Firefox.
Is this possible to do?
The reason why i want it this way is because the C++ code in the DLL will talk with another C++ DLL and take instructions on how and when to show the HTML/JS controls.
As i said earlier, i have worked with CDHtmlDialog in MFC Dialog app. But in this case i don't need any MFC controls. All i need is a Web Browser capability like the one CDHtmlDialog provided. And also this should be launchable from with in another web browser like IE or Chrome or Firefox.
Please let me know of any examples that does similar things.
Your question is too broad for a technical forum; we deal here with specific problems. For general "how to" questions you need to do the research and find the samples and articles that will help to build your project.
I want to develop a DLL that has a web browser embedded in it. ...then load this
DLL into a web browser like IE, Chrome or Firefox.
So you have a web browser (doesn't matter whether you create it or not) and then run it in a web browser.
The question is similar to asking if one would want to run Chrome inside of Firefox.
Don Guy wrote:
Is this possible to do?
It is possible to create a web browser in a dll. To create a functioning browser then one would simply use the dll in the exe and call probably one method.
That said a web browser is a user tool and a client side tool. I doubt there is any need to have a browser that one can embed and moreover it would likely irritate users because a non-trivial number of them are really attached to the browser they use.
Standard browsers can run executable content if the users allow that. The executable content can be anything, so it could certainly start a browser.
But excluding attempts to circumvent security and attempt to hack information from users I can't see any point to this.
If you want something inside the function protected from parallel/recursive calls, you can do that by placing a criitical section and a class member variable inside it. If don't want the function to be called at all, you could make it private and add a public function as the only one that calls it. It could look something like that:
EnterCriticalSection(); // keep other treads out
if (!alreadyRunning) // static private member variable to prevent recursive calls
alreadyRunning = true;
alreadyRunning = false;
alreadyRunning = false; // important to do that before leaving the critical section
LeaveCriticalSection(); // prevent a dead lock
throw; // let the caller decide what to do with the initial exception
So privateFunction() will only be called once at a time no matter from which thread (provided you don't add another member function that calls it or introduce any friend classes).
The good thing about pessimism is, that you are always either right or pleasently surprised.
Not bad but in C++ you should use RAII for this, use the destructor of an auto (stack) object as your finally block.
// do work here, cs will be automatically released when leaving the function
// the cs2 criticalsection will be left automatically at the end of this scope
// do work
For one, this article promotes 80's #define's as if they're still a valuable solution (hint: a global const variable can do the same and is always the better option).
Also the later suggestion is not only obvious (use member variables, duh!), but actually needlessly complicates things: you can name structs just like classes without typedef's, and if you really need a global structure for these things, use templates! How can code with #define's and typedef's be called "Optimized for C++11", when it looks more like C72?
Now I am wondering: Is the article that bad? Is he mentioning valid points ( I got him with the "use templates", but I am still not sure whether I can trust him or not - After all, his profile says "Web developer").
Since I want to provide quality articles to the community I'd also want a feedback on what I could improve with the article to make it more valuable and up-to-date.
Thanks for any help
You know the world is going crazy when the best rapper is a white guy, the best golfer is a black guy, the tallest guy in the NBA is Chinese, the Swiss hold the America's Cup, France is accusing the U.S. of arrogance, Germany doesn't want to go to war, and the three most powerful men in America are named "Bush", "Dick", and "Colon."
I've just taken a quick look at your article but I agree with the guy. To me it seems that you are a C programmer who is quite new in C++. Defines should be avoided whenever possible. In a lot of cases defines can be replaced with template/inline functions. In some other cases long macros can be replaced to a combination of a short macro + template/inline functions/classes. Macros don't respect name spaces and they arent type safe. Still, some small stupid problems can be solved practically only with macros (for example automatically logging out filename/linenumber/functionname can be done only with a logger macro). But even when you are using a macro its better to keep the body of the macro short by immediately calling a function or intantiating/using a class. Using typedef on structs in C++ is awkward and using header guards is also deprecated in my opinion, in a large project you got a very strange error message with a duplicate (for example copy-pasted) header guard and today all major compilers support "#pragma once".