|
As I said before, split the line:
IntPtr hdc = GetDCEx(m.HWnd, m.WParam, DCX_WINDOW|DCX_INTERSECTRGN);
Graphics g = Graphics.FromHdc(hdc); This is the very problem I mentioned earlier about combing such complex, compound statements together. Now which lines does the exception get thrown?
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I still get the error
it seems the handle is null... When I call the GetDCEx I have 0x0 as result.
There is no spoon.
|
|
|
|
|
bouli wrote:
When I call the GetDCEx I have 0x0 as result
Check to make sure you have a valid handle to the window when you call GetDCEx .
- Nick Parker My Blog | My Articles
|
|
|
|
|
I always get a null handle
There is no spoon.
|
|
|
|
|
And for the 3rd time, on which line do you get the error after splitting the two methods on two separate lines?
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
I get the error because the Handle returned by GetDCEx is null.
I can understand that the handle is null once (at initialization time), but it's always null
there is maybe something wrong in my declaration?
There is no spoon.
|
|
|
|
|
So the exception is being thrown on the second line? How hard is that question to answer?
You need to debug your code and find out this type of information. Is the Message.HWnd or Message.WParam NULL (IntPtr.Zero ) before being passed to GetDCEx ?
I never said splitting the lines would make it work - that doesn't matter when the compiler produces the IL. I said it would make things easier to debug. Put a break-point in there and step through your code to see what the inputs and outputs of the methods are. And always perform checks (like making sure that GetDCEx doesn't return IntPtr.Zero before passing it to Graphics.FromHdc ) - never assume something just works (especially when dealing with interop since the callee is unmanaged by the CLR).
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
hi,
ok, I'm going to dig deeper.
but it was easier to draw in the NC area with MFC
.NET is very different... I need to check my marks.
Thanks for the help
There is no spoon.
|
|
|
|
|
Yes, of course it's very different. .NET is referred to as a "managed environment" because the Common Language Runtime (CLR) manages memory, provides garbage collection (no explicit destruction of objects like in C/C++/MFC), and many other things.
The important thing to remember is that Windows Forms controls encapsulates the Windows APIs, so everything possible in MFC would be possible in .NET, but you have to P/Invoke native APIs (and don't P/Invoke those that are already covered in .NET APIs), define structs and consts, etc. You can't simply call native APIs like you could in MFC, unless you were to use a Managed C++ assembly in a mixed-mode compilation.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
how to get all TimeZone and send it to Time Server, recieved Time Server reply and add it to database
thanks.
Nho'c Ti`
|
|
|
|
|
What??????????????????????????????
This doesn't make any sense whatsoever. What do you mean by "get all TimeZone" and "send it to Time Server"? What are you trying to do with this information? Are you trying to get a Time value from a server localized to your time zone?
And what's with the database?
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
|
Hi,
I've searched everywhere! Does anyone here know how to call a function from C# from an IntPtr? I know how to obtain the function pointer:
IntPtr ptr = (typeof(SOMECLASS).GetMethod("SomeMethodName").MethodHandle.GetFunctionPointer())
Now I just need a way to call it ..
The reason I need this is because in MSHTML, there is an interface called IHTMLElementRender, and the function 'DrawToDC' (useful for capturing HTML documents as an image) takes the argument HDC, but is implemented to take a reference variable of an unrelated structure. Therefore I need to call the function by the pointer, as in C++.
Thanks!
- Joe Esposito
|
|
|
|
|
You've run into one of the limitations of IDL: it was originally for describing structures to be marshalled across processes, but some things we'd like to describe in IDL - handles to GDI and USER objects - are process-relative and have no meaning in another process. So the IDL contains a fake definition.
I've browsed Google Groups for _RemotableHandle . The recommended answer is apparently to use ILDASM to generate IL code for the interface, change the declaration to take an IntPtr , then recompile it. Not nice.
I'd actually recommend using Managed C++ to wrap the interface as declared in mshtml.h.
Stability. What an interesting concept. -- Chris Maunder
|
|
|
|
|
Instead of wrapping this with an MC++ assembly as the first reply states, just interop the interface yourself. Such it's such a simple interface, it won't be hard:
[ComImport, Guid("3050f669-98b5-11cf-bb82-00aa00bdce0b"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IHTMLElementRender
{
void DrawToDc(IntPtr hdc);
void SetDocumentPrinter(
[MarshalAs(UnmanagedType.BStr)] string printerName, IntPtr hdc);
} You could then use Marshal.GetComInterfaceForObject to get a pointer to this interface. You then call Marshal.GetObjectForIUnknown and cast to the interface like so:
IntPtr ptr = Marshal.GetComInterfaceForObject(element,
typeof(IHTMLElementRender));
IHTMLElementRender render = (IHTMLElementRender)Marshal.GetObjectForIUnknown(
ptr);
render.DrawToDc(hdc);
Marshal.Release(ptr); Please note that this is untested but I've used similar code with different interfaces before with success.
I hope this helps.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
Thanks! That did exactly what I needed it to!
I did consider using this method, however all of my attempts failed and left me clueless.
It seems that this attribute really makes the difference:
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
Without it, the program simply crashes when you try to use it.
Also, I have been using type-casts where QueryInterface would be required. It also worked in this case:
IHTMLElementRender render = (IHTMLElementRender)element;
render.DrawToDc(hdc);
Thanks again for your reply
- Joe
|
|
|
|
|
When you perform a type-cast, the CLR performs a QI (QueryInterface ). In some cases, however, the compiler will complain if the object (if it's type is known) doesn't and never could implement that interface.
Glad it works for you.
Microsoft MVP, Visual C#
My Articles
|
|
|
|
|
windows provides many win32 functions for error detection on system level.
is there a possibility to detect error on application level?
for example: while running an application, there comes out a warning dialog which might means error. Can i detect it timely ?
|
|
|
|
|
fu0 wrote:
there comes out a warning dialog which might means error. Can i detect it timely ?
Then don't write the code that displays the dialog.
I don't think this is the answer you expect, can you be more explicit in your question.
"If a man empties his purse into his head, no man can take it away from him, for an investment in knowledge pays the best interest." -- Joseph E. O'Donnell
The Second EuroCPian Event will be in Brussels on the 4th of September
Can't manage to P/Invoke that Win32 API in .NET? Why not do interop the wiki way!
|
|
|
|
|
I don't quite know what your asking for but try looking up 2 fatures of .Net.
Exception Handling / Throwing
Trace Switches and the debug class.
Can't really be more helpfull without knowing more about your problem.
Try searching on MSDN for the above subjects and see if that helps.
Kev Pearman MCP
|
|
|
|
|
my idea is this:
in a sample, an application(not my own) displays a messagebox which might means some error happened.
then my own application could know something happened by this event(messagebox's displaying). however, my application dont want to know any details about the error, it only write into a log like this: when, which application, something happened. And my application dont want to interfere with the application. it works like a shell.
could i realize it ?
|
|
|
|
|
So you want your application to run and if another application displays a MessageBox you want your application to do something, but you don't want your application to be tied into the other application at all?
If that is the case then i'm afraid i can't help you, i wouldn't even know where to start. If thats not the case then please say so.
Kev Pearman MCP
|
|
|
|
|
in my original idea, i dont want my application to be tied into other applcation.i thought it would interfere with other appliction's nomarl process.
from these words:but you don't want your application to be tied into the other application at all,i guess :
if my application is tied into other application,will it have the ablitiy to do the work ?
could you make a suggestion about your idea ?
|
|
|
|
|
Is the "Other Application" something that your developing? If it is you could tie the two together somehow, sending a message to your "Listening" application to prompt it to do something?
Without knowing the entire problem it's difficult to suggest anything specific.
Hope you are able to solve the problem.
Kev Pearman MCP
|
|
|
|
|
i think the real problem is: "The other applciation" is not my developing . So i want to find a way how to monitor other application 's status to comfirm whethere there occurs an error.
in my opinion, if i can recorgnize a messagebox's displaying i can guess there might be an error occured.
|
|
|
|