|
I am unsure if you can store it as a stream. IIRC, word document files are storages, and not streams. I suppose you could save the OLE Structured Storage as a stream, but that's like storing a file system within a file - it probably doesn't do you any good.
--
My name in Katakana is ヨルゲン.
My name in German is Jörgen.
My name in Mandarin/Kanji is 乔尔根 西格瓦德森.
I blog too now[^]
|
|
|
|
|
Thanks, I was beginning to wonder if I was going blind, and just couldn't see the method name. The best thing I've come up with, is Get_XML().
"After all it's just text at the end of the day. - Colin Davies
"For example, when a VB programmer comes to my house, they may say 'does your pool need cleaning, sir ?' " - Christian Graus
|
|
|
|
|
hello
I found this
http://www.codeproject.com/com/DHTML_Interfaces.asp
here on cp but it only works for ie
is there any way in wich I could apply this for mozilla or does mozilla simply not use coms like ie does and if not how else could I achieve the same results
|
|
|
|
|
Help!
A series of business objects have been created in C# and COM Interop has been enabled to send objects back and forth between the Managed C# and the unmanaged C++ code.
After hurdling a series of obstacles to get these two worlds talking with each other, the problem of accessing the objects returned in a SAFEARRAY from the C# side is causing a problem.
Here is a code sample from the C# side.
The interface is _YohoFolders while the CoClass is YohoFolder.
ArrayListRule RuleFolders;
public object[] GetFolderArray()
{
return RuleFolders.ToArray();
}
object[] _YohoFolders.GetFolderArrayI()
{
return GetFolderArray();
}
However on the other side of the gap between Managed and Unmanaged the only elements that are accessible are the interfaces. Is there a methodology for passing back an Array of interfaces back to the C++ side of the fence? If so please let me know.
In the C++ world the code looks something like this:
MyNamespace::YohoSingleFolder pFolder;
pLeSafe = pAllFolders->GetFolderArrayI();
for( int i = 0; i < nTotalFolders; i++ )
pFolder = (MyNamespace::YohoSingleFolder)(pLeSafe[i].pvData);
End code
If anybody has any ideas, please let me know.
Thank you all in advance for looking at this.
Regards
Ward
Frag
Try, Fail..Fail, Succeed
Tool Developer
Michigan, USA
|
|
|
|
|
I found the solution to this. Actually by configuring things properly a person can directly access the object inside of the Unmanaged code. I am not sure this is a desired ability, but it can be done. It may be something that you would like to do, if so let me know and I will post the code.
Ward
Frag
Try, Fail..Fail, Succeed
Tool Developer
Michigan, USA
|
|
|
|
|
hi
i am new to COM and want to know the difference b/w COM component and ActiveX control.
thanks in anticipations
Muhammad Azam
|
|
|
|
|
|
Thanks a lot, i got it but one thing is still ambiguous........then why do we need ActiveX controls when we have COM ?
thanks in anticipation
Azam
|
|
|
|
|
Hello Azam,
Let take a example for understanding difference between COM DLL and ActiveX Control .
if you are done some Windows Programming, you must have use CreateWindow() (which help in creating window) api, this api is just a function with no user interface but when you use BUTTON on the Dialog box it have UI to interact with it.
same is difference betwwen COM DLL and ActiveX Control . COM Dll proviode you with backward functionality like CreateWindow and ACTIVE X Control provide you BOTH backward Functionality and UI (depend on your need) like BUTTON.
Hope you somewhat grasp the difference between COM DLL and ActiveX Control
"I Think this Will Help"
[Vote One Here,.....]
<h5
alok gupta="" <br=""> visit me at http://www.thisisalok.tk
|
|
|
|
|
thanks Sir........ now i got it clearly. thaks once again for making it clear to me
Azam
|
|
|
|
|
I have written a C++ COM object and I now wish to make some alterations to it.
My current understanding of COM is:
- You can't add or remove methods/properties from an interface, nor can you change parameters on existing methods.
Can someone give me a simple explanation (or point me to one) of why I can't add new methods/properties to an interface? I would have thought that as long as I don't change what's already there, it wouldn’t break binary compatibility. I wrote a small test DLL, built a C++ test app based on it, then added new methods to the interface without rebuilding the test app and it didn't break at runtime. Was I just lucky? Are some languages more/less forgiving about this than others?
- Am I allowed to add new values to an enum that is defined in my IDL?
- What if I have a situation like this:
interface MyInterface
{
[id(1)] HRESULT CreateVideo([out, retval] IVideo** p);
}
I now want to add IVideo2 which implements IVideo.
Assuming that it's illegal for me to simply add CreateVideo2([out, retval] IVideo2** p) to MyInterface, the alternative is to create a whole new MyInterface2 just for CreateVideo2(). But if MyInterface is referenced from another interface then I'd have to create a new version of that interface, except it would reference MyInterface2. And what if *that* interface is referenced by yet another interface? I could suddenly find myself doubling the number of interfaces just to accommodate one small change.
Can I instead change the CreateVideo() code to internally create an IVideo2 object but cast it back as IVideo? That way existing clients can still use the unchanged CreateVideo() interface, while newer clients can then cast the returned object back to IVideo2 and get all the new functionality. Or will this break binary compatibility anyway?
I realise that this is kind of ugly because it requires newer developers to know that they can cast the returned IVideo to IVideo2, but it would sure save a lot of my time as well as cut down on interface bloat.
Any thoughts or advice would be much appreciated!
Gary
|
|
|
|
|
Sir Garence wrote:
why I can't add new methods/properties to an interface?
If you add new methods, and keep the same GUID, you'll write code that starts up a COM object, based on that GUID, and will assume that method is there. for anyone who has your old component, the object will spin up, and blow up when that method is not there.
Christian
I have several lifelong friends that are New Yorkers but I have always gravitated toward the weirdo's. - Richard Stringer
|
|
|
|
|
Hi Christian,
Thanks for responding.
My main concern - and this is the most likely scenario - is older apps running against the newer component. If I add new methods or properties to existing interfaces (but don't remove or change what was already there), will this cause any runtime issues?
Thanks again,
Gary
|
|
|
|
|
On that front, you should be fine. But murphys law states that the reverse scenario will bite you at some point.
Christian
I have several lifelong friends that are New Yorkers but I have always gravitated toward the weirdo's. - Richard Stringer
|
|
|
|
|
Hi,
I'm discovering COM programmation. I've created a client - server application in .Net.
It works fine but for each client, a new server instance is created.
I would like to create only one instance of a server on a remote machine on which clientS could connect to it.
This is the site who helps me to create my client - server : http://my.execpc.com/~gopalan/dotnet/classic_com/com.net_quoteserver.html
Thks a lot
Denis
|
|
|
|
|
Hi sokettepower,
ur COM components appartment should be MTA (Multi-Threaded Appartment), I suppose !
Look out for more info. on STA, MTA and Proxy Stub.
Cheers,
Vishal
|
|
|
|
|
in the SetWindowsHookEx function, I set the _pModule->get_m_hInst() as the HINSTANCE parameter.
The relust of this code is a local hook on the procedure.
"Global hook procedures should be placed in a separate DLL". is com is a separate DLL
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL,
LowLevelKeyboardProc,
_pModule->get_m_hInst(),
0);
a related article is talking about the subject in a standart DLL (not COM).
http://www.codeproject.com/win32/AntonioWinLock.asp
|
|
|
|
|
I don't see why it couldn't work. Why don't you just try it?
--
My name in Katakana is ヨルゲン.
My name in German is Jörgen.
My name in Mandarin/Kanji is 乔尔根 西格瓦德森.
I blog too now[^]
|
|
|
|
|
Hi nadzzz,
Is ur com object a dll ?
- If it is then u can't install global hook, to install global hook ur application must be an exe (rather than dll)
See the global hook docs for more info.
Cheers,
Vishal
|
|
|
|
|
My COM server should fire the event of a VB client. The code (generated by the Wizard) is as follows
HRESULT Fire_GetResult(VARIANT retResult)
{
CComVariant varResult;
T* pT = static_cast<t*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[1];
int nConnections = m_vec.GetSize();
...
...
The problem here is that m_vec.GetSize returns 0 and hence the for loop to fire the event is not called and return value is 0xCCCCCCCC
However firing the event works intially and after a few function calls, it stops working!
I am totally confused what could the problem be. Is it because of some memory leak or anything else. Please comment on possible problems.
Also I would like someone to tell me whose responsibility it is to free the BSTR or VARIANT arguments in interface method, server or clients? for both by value and by reference type.
Thank You
Mayur Mahajan
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
I have a problem. I need a COM dll, which takes a string as a filename and has to return a IPropertyBag by reading the file. The file may be simple text file, that consists a name value pairs. Once the file is read, the name value pair has to be added to the IPropertyBag. From the client I should be able to retrieve the name value information from the IPropertyBag.
The interface is defined like this
__interface IMetadataParser : IDispatch
{
[id(0), helpstring("method ParseMetadata")]
HRESULT ParseMetadata( [in] BSTR bstrXMLFilePath, [in,out] IPropertyBag** ppPropMetadataBag );
};
The client code looks like this.
hr = CoCreateInstance( CLSID_CMetadataParser, NULL, CLSCTX_INPROC_SERVER,
IID_IUnknown, (void**)&m_oMetadataParser );
CComObject<csubcomppropertybag> *pIOCRPropBag;
hr = CComObject<csubcomppropertybag>::CreateInstance(&pIOCRPropBag);
CComPtr<ipropertybag> pPropBg = NULL;
HRESULT hResStack = pIOCRPropBag->QueryInterface(IID_IPropertyBag, (void**)&pPropBg);
CComQIPtr<ipersistpropertybag> pISubPPB(m_oMetadataParser);
m_oMetadataParser->ParseMetadata(bstrXMLFilePath, &pPropBg1);
The definition of the class CSubCompPropertyBag is as follows:
typedef std::map<std::string, variant=""> PropBag;
typedef PropBag::iterator PropBag_IT;
typedef std::pair<std::string, variant=""> MapEntryPair;
CComModule _Module; //this should be in client
class ATL_NO_VTABLE CSubCompPropertyBag :
public CComObjectRootEx<ccomsinglethreadmodel>,
public IPropertyBag
{
public:
CSubCompPropertyBag()
{
ATLTRACE(_T("CSubCompPropertyBag is constructed \n"));
}
~CSubCompPropertyBag()
{
PropBag_IT bagIt = m_propBagMap.begin();
while(bagIt != m_propBagMap.end())
{
VARIANT varDel = bagIt->second;
if(VT_BSTR == varDel.vt)
::SysFreeString(varDel.bstrVal);
bagIt++;
}
m_propBagMap.erase(m_propBagMap.begin(), m_propBagMap.end());
ATLTRACE(_T("CSubCompPropertyBag is destructed \n"));
}
DECLARE_PROTECT_FINAL_CONSTRUCT()
DECLARE_NO_REGISTRY()
BEGIN_COM_MAP(CSubCompPropertyBag)
COM_INTERFACE_ENTRY(IPropertyBag)
END_COM_MAP()
//Method implement the IPropertyBag::Read() function
// move property value from private map to *pVar based on pVar->vt
//this function will be called from IPersistPropertyBag::Load() method
// for each property in ATL property map
STDMETHOD(Read)(LPCOLESTR pszPropName, VARIANT *pVar, IErrorLog *pErrorLog)
{
USES_CONVERSION;
if ((pVar == NULL) || (pszPropName == NULL))
return E_INVALIDARG;
std::string sPropName(W2A(pszPropName));
ATLTRACE("CFlowPropertyBag::Read() get called for property %s \n", sPropName.c_str() );
PropBag_IT bagIt = m_propBagMap.find(sPropName);
if (bagIt == m_propBagMap.end())
{
ATLTRACE("Fail to find the property %s in property bag\n", sPropName.c_str());
return E_FAIL;
}
else
{
try
{
VARIANT varValue = bagIt->second;
::VariantInit(pVar);
if(VT_ARRAY != varValue.vt)
{
HRESULT hr = ::VariantCopy(pVar,&varValue);
if(FAILED(hr))
throw E_FAIL;
}
else
{
SAFEARRAY *psaLanguage = varValue.parray;
pVar->vt = VT_ARRAY;
pVar->parray = psaLanguage;
}
ATLTRACE("Set property value from property bag completed\n");
return S_OK;
}
catch(...)
{
return E_FAIL;
}
}
}
//Method implement the IPropertyBag::Write() function
// move property value from *pVar to private map
//this function will be called from IPersistPropertyBag::Save() method
// for each property in ATL property map
STDMETHOD(Write)(LPCOLESTR pszPropName, VARIANT *pVar)
{
USES_CONVERSION;
if ((pVar == NULL) || (pszPropName == NULL))
return E_INVALIDARG;
std::string sPropName(W2A(pszPropName));
ATLTRACE("CFlowPropertyBag::Write() get called for property %s \n", sPropName.c_str() );
try
{
PropBag_IT bagIt = m_propBagMap.find(sPropName);
if (bagIt != m_propBagMap.end())
{
m_propBagMap.erase(bagIt);
}
VARIANT varVal;
::VariantInit(&varVal);
if(VT_ARRAY != pVar->vt)
{
HRESULT hr = ::VariantCopy( &varVal,pVar);
if(FAILED(hr))
throw E_FAIL;
}
else
{
SAFEARRAY *psaLanguage = pVar->parray;
varVal.vt = VT_ARRAY;
varVal.parray = psaLanguage;
}
std::pair<propbag_it, bool=""> ret =
m_propBagMap.insert(MapEntryPair(sPropName, varVal));
if (ret.second != TRUE)
throw E_FAIL;
ATLTRACE(_T("Write property into property bag completed\n"));
return S_OK;
}
catch(...)
{
return E_FAIL;
}
}
PropBag m_propBagMap;
};
Thanks in advance for the help.
|
|
|
|
|
Hi,
I have a COM service running under a W2000 machine.
I know the service starts when I turn the machine on, before I log on, but I would like to know how to get a notification that the user has logged on/off the machine.
Thanks in advance,
Vinicius
|
|
|
|
|
Here you answer again
For that you have to write Winlogon Notification Package.
look for example here
http://www.codeproject.com/system/winlogon_notification_package.asp
"I Think this Will Help"
[Vote One Here,.....]
<h5
alok="" gupta="" <br=""> visit me at http://www.thisisalok.tk
|
|
|
|
|
|