|
One way would be to render it into a bitmap created using the CreateDIBSection[^] function. You could also try looking at the GetDIBits[^] function. With both of these you use the handle returned by the get_Handle method.
Steve
|
|
|
|
|
As a rule, the object implemented IPictureDisp implements also IPersist**** interface (IPersistStream, seems) which can help you.
With best wishes,
Vita
|
|
|
|
|
That's an interesting suggestion, but if the implementation persists the image (say a compressed .jpg) as a compressed .jpeg you haven't got yourself a ready-to-use byte-array.
Steve
|
|
|
|
|
Hi everyone!
I have a COM control that makes also use of some COM server.
Within the control I am receiveing a COM exception from the server and I have to report this error again to the control's parent.
So my naive approach was something like this:
<br />
try { ... } catch( _com_error &e)<br />
{<br />
std::string description = e.Description();<br />
Log(ERROR, "COM error: " << description);<br />
return Error(description.c_str(), IID_MY_CONTROL);<br />
}<br />
But this statement makes the control's container crash without any message!
If I replace my description string with some harcoded message, it works just fine. But whenever I rely somehow on the e.Description, bang, it crashs.
I assumed it could already be freed the time it would be read on the container side, so in a further step I tried to copy the description in a new allocated variable, to save it somewhere within the control instead of locally within the catch-block, etc. But nothing works.
What are the reasons why I cannot "forward" this errror description? It can be logged correctly, but I have no chance to bring it on the containers side.
Best regards, Roland
|
|
|
|
|
Found the problem myself.
Thank god it was not my fault, but the container that embedded my control cannot handle long error descriptions.
The common ActiveX Testcontainer could receive those COM error message without any problem, but the application that instantiated my control killed itself whenever it got long messages. Seems like they are using a small buffer and try to copy the long message into a small character array or whatever.
As workaround I simply truncate my error messages. (Ok, over 1000 characters error description is perhaps really very very long )
But is there are maximum size for error descriptions defined? I could not find any restriction regarding the length... and TstCon32 can handle long messages. Hm
|
|
|
|
|
Hello All!
How can I add .net control to ATL window?
I don't need to pass any message between ATL and C#,
only "paste" the control on ATL window.
thanks!
|
|
|
|
|
You give only little information about the .net control... there are several possible ways, but most are simply dirty hacks (e.g. using SetParent on the .NET control's window handle and embedding it into your c++ ATL window. Ah, don't do this!)
In general I would say that's no COM question, but anyway:
Best way (in my opinion) would be to build a C++/CLI wrapper around your control. You could write a C++ control and create an instance of your .NET control on top of it. Mixed-mode at its best!
Best regards,
Roland
|
|
|
|
|
I am having problems converting a System.__ComObject to a serialized class.
I am running two separate applications, both C#.
App #1 is a winform with a ListView.
App #2 is a C# extension inside another application. The extension is a winform.
I am dragging a ListViewItem onto the extension on App #2.
In App #1 I am looking at the ListView_ItemDrag event
I have two serialized classes - DragClass() and Transport() {from examples I found on net}
DragClass holds the ListViewItem name and also the actual ListViewItem
Transport is a collection class that holds the DragClass
Inside this event I am creating a new instance of DragClass and populating it
Create a new instance of Transport and populate that.
I then call DoDragDrop passing in the Transport as parameter.
On App #2 - In DragDrop event the e.Data returns System.__ComObject
I am using this code to try and cast it:
Transport trans = e.Data.GetData(typeof(Transport)) as Transport;
Transport class is a serialized class on App #2 as well.
is this proper way of doing this? I seem to keep getting null back with error Cannot cast System.__ComObject to System.Type.
Any suggestions?
Thanks
|
|
|
|
|
If you're using .NET Framework 3.5 or previous for your applications, you're going to be forced to break out Reflection[^] to either manually deserialize the COM object into your custom types, or to just manually access the members themselves. If you're using .NET Framework 4, you can use C#'s new dynamic keyword to do the same thing with little excess code.
Adam Maras | Software Developer
Microsoft Certified Professional Developer
|
|
|
|
|
yea this is in 3.5, I can go the Reflection route and see where that leads me. I've been trying to Marshal it, then read about needing an interface but can't for the life of me think of why or how I would implement an interface in this design type. Just doesn't fit with what im wanting to do.
But thanks for the time and reply. I'll do some tests and see if it works using that.
|
|
|
|
|
Hi,
Iam also trying to do a similar cast, but not able to figure out the way to do this. Can you please give me some code snippet for doing this using reflection as you have suggested ? Thanks.
|
|
|
|
|
Hi All,
We have implemented a Method type of WMI Provider.
1) It is a coupled provider and its loading / unloading is handled by WMI. Specifically it is loaded in WMIPrvSE.
2) UnLoadTimeout is set to NULL and Pure property has been set to TRUE
3) The WMI provider methods have been declared static in the MOF file also.
In this context, we have a requirement where the client needs to call one method on the WMI provider and when we call the next method, it needs to "remember its state". The client application holds the connection to the object and tries to call the next method. However we are noticing that the provider is being unloaded and the next method call happens on a different object itself.
Please let us know your suggestions on resolving this problem. Can we achieve this functionality with method type of provider at all??
Thanks in advance for your help,
Regards,
Srikanth
|
|
|
|
|
I am developing an application to play mp3 files using directshow .I want to show visualization like windows media player .But I am not getting how do i this . Is there any filter or any technique to show visualization in custom mp3 player.
modified on Monday, August 17, 2009 2:13 AM
|
|
|
|
|
I have an issue where the majority of our applications that we have built are ms access 2003 based applications however several of the applications have went thru MS Office 2007. When this happened the MODI active x control changed from version 11 to version 12. Now the applications all crash on machines where ms office 2007 is not installed on. Is there any way of installing the active x component with the application on the 2003 machines with out reinstalling ms office 2007?
I get an error 438 that the object does not allow for the property if the machine has only ms office 2003 installed. But when ms office 2007 is installed (Only the document image (MDI) Application) it will work just fine). What can I do to resolve this issue for us and our customers who do not have ms office 2007. I have tried removing all references and controls from the application, then putting the references back on a machine that has only 2003 installed on it but the problem stays intact. Some how it is still referencing the MODI Version 12 ocx active x control not the v11.
|
|
|
|
|
Hello everybody,
I am in the following situation. I have a website which runs in a secure environment.
I use an object with the CLSID: 0002E510-0000-0000-C000-000000000046 to show a excel workbook in the html page.
Since a Microsoft security update from July, this doesn't work anymore.
Now I am searching for a solution to get this working again. I found the I can change the registry key:
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{0002E510-0000-0000-C000-000000000046}]
FROM: "Compatibility Flags"=dword:00000400
TO: "Compatibility Flags"=dword:00000000
After this change everything works fine, but when I restart the computer the security update is installed again.
Is there any other solution to get this component working again, than changing the registry?
Or is there a registry value to change which suppresses the Micorosoft Update to run again?
Any other ideas?
Thanks in advance.
Erik
|
|
|
|
|
hello ,
I create Toolbar button using TBBUTTON. To set tootip i set SendMessage(m_hWnd, TB_SETMAXTEXTROWS, 0, 0L), by doing this iString member of TBBUTTON is set as ToolTip, but i want both, ToolTip and Caption to Toolbar button.So how can i set this.
I refer http://msdn.microsoft.com/en-us/library/bb760446(VS.85).aspx#Displaying_Tooltips_for_Buttons link.
Thanks
am9
|
|
|
|
|
After more than 8 hours trying to fix up a memory leak I need some help :/
I have a ATL COM component, with the following interface:
STDMETHODIMP CDCSClient::CallService( VARIANT *p1 )
Inside the method I do the following:
VariantClear( p );
VariantInit( p );
p->vt = VT_BSTR | VT_BYREF;
BSTR *pBSTR = new BSTR;
*pBSTR = SysAllocString( L"abc" );
p->pbstrVal = pBSTR;
And my client in VB is like this:
For i = 1 To 1000
Dim myInt As Integer
myInt = 3
ret = client.CallService(myInt)
Next
As far as I know the COM engine is creating a VARIANT from my integer (which is received as VT_BYREF | VT_I2), and I change it to VT_BSTR.
The VB loop causes a huge memory leak.
Am I doing something wrong ? How the COM engine handles the new VARIANT/BSTR deallocation ?
Thanks for any help.
|
|
|
|
|
It seem's you might not correctly release the BSTR accociated with the VARIANT *p1 variable.
You might have manually to release variant accoiated with myInt variable.
|
|
|
|
|
It was my first guess, but I don't think so...each time I receive a call (from the loop) I receive the same integer VT_BYREF | VT_I2 (which is deallocated by VariantClear).
It seems that this BSTR is lost between calls, causing the leak (obviously myInt is an integer and can't reflect changes).
|
|
|
|
|
If the BSTR is lost why don't you use BSTR* as variable type instead of VARIANT.
Which version of VB are you using?
|
|
|
|
|
I can't change that interface, the real code is far more complicated, basically I need to receive a VARIANT* and change their value, and the new value comes from a c++ string.
I'm testing using VB 6.
Thanks.
|
|
|
|
|
I suspect that rather than 'new BSTR', you should use CoTaskMemAlloc[^] to allocate memory in a COM server:
BSTR *pBSTR = (BSTR*)CoTaskMemAlloc(sizeof(BSTR));
However - one other thing strikes me - why pass the BSTR back by reference? Why not use this?
VariantClear( p );
VariantInit( p );
p->vt = VT_BSTR;
p->pbstrVal = SysAllocString( L"abc" );
One less allocation, one less place to leak memory!
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
Hi
The same happens with CoTaskMemAlloc, and using VT_BSTR instead of VT_BSTR | VT_BYREF.
Thanks anyway.
|
|
|
|
|
How CallService is defined in IDL file? If it's "CallService([in] VARIANT *p1)", then you cannot change the parameter. If it's "CallService([in,out] VARIANT *p1), then you cannot receive the parameter in Integer.
IAC, VB passes myInt variable as VT_BYREF | VT_I2 to be possible to change the myInt value. It's made only during call some method. Inside VB don't store variant by this manner.
STDMETHODIMP CDCSClient::CallService( VARIANT *p )
{
VariantClear( p );
p->vt = VT_BSTR;
p->bstrVal = SysAllocString( L"abc" );
return S_OK;
}
If you desire to pass BSTR by reference, you should keep out this address and make sure to free this BSTR after using.
BSTR g_pBSTR = NULL; // global scope, so somewhere should be "if (!g_pBSTR) SysFreeString(g_pBSTR);"
STDMETHODIMP CDCSClient::CallService( VARIANT *p )
{
VariantClear( p );
p->vt = VT_BSTR | VT_BYREF;
if (!g_pBSTR) g_pBSTR = SysAllocString( L"abc" );
p->pbstrVal = &g_pBSTR;
return S_OK;
}
With best wishes,
Vita
|
|
|
|
|
The parameter is defined as [in,out,optional].
And yes, now I understand, as I suspected, I can't reallocate the VT_BYREF | VT_I2 inside my ATL code.
The only thing still not 100% clear which confused me is that I can define a VB procedure receiving a byref variant, do the same thing receiving my int, and changing it to String and no leak happens. That was my first test.
But the difference is: there's no COM in this scenario, and the pure VB allocation\dellocation mechanisms are not the same.
Thanks a lot !
|
|
|
|