|
Hi all,
I'm trying to open a video stream but problems arise. Have a look at the code below:
::CoInitialize(NULL);
::AVIFileInit();
PAVISTREAM pAvi;
HRESULT hr = ::AVIStreamOpenFromFile(&pAvi, "any.avi", streamtypeVIDEO, 0, OF_READ, NULL);
if (SUCCEEDED(hr))
{
AVISTREAMINFO si;
::AVIStreamInfo(pAvi, &si, sizeof(AVISTREAMINFO)); // <- Works ok
IGetFrame *pGetFrame;
pGetFrame = ::AVIStreamGetFrameOpen(pAvi, NULL); // <- Always returns NULL
if (pGetFrame != NULL)
{
pGetFrame->Release();
}
pAvi->Release();
}
::AVIFileExit();
Now, according to msdn, AVIStreamGetFrameOpen() returns NULL if it could not find a decompressor for this specific file. I can however view the file in windows media player w/o any problems. Doesn't that imply I do have a decompressor installed for this file???
I'm confused. Any help on this would be appreciated.
/Niklas
|
|
|
|
|
Hi,
Can u'll give me a sample code for putting named arguments in a DISPPARAMS structure.
Thanx,
Madhavi.
|
|
|
|
|
i tried putting a vector into structure and then putting that structure in to variant , but while retrieving the values from a variant it gives a linking error .
is there any other way to do this ?
parag
|
|
|
|
|
Look at IEnumXxx interfaces, there is an IEnumVariant from memory. It allows you to return a list and iterate through it. Look for IEnumVARIANT in MSDN.
Christian
Secrets of a happy marriage #27:
Never go to bed if you are mad at each other. It's more fun to stay up and fight.
|
|
|
|
|
Well, as I found out, OleCreateFontIndirect can not be used in the WinCE ATL Full Controls, 'cause it simply is not there Thing is, I created the control, that exists both under WinCE and Win32. One of the stock properties the control uses is "Font" one. And the only way to create the font from the FONTDESC structure is by using OleCreateFontIndirect method. Another trouble is that WinCE IFontDisp does not support all the IFont's interfaces and properties that are persisted by the its Win32 version. What's your advise?
Alex Stepovenko
|
|
|
|
|
Hi,
Anybody know how to programmatically move a windowless control to a fixed location (e.g. top-left corner) on a VB form, after it is being created on the VB form?
I can do this with windowed control, by calling IOleInPlaceSite::OnPosRectChange() in OnCreate() function for the windowed control.
Since windowless control does not handle WM_CREATE message, at which function can I request the control to reposition itself using IOleInPlaceSite::OnPosRectChange()?
Any idea/hint to share?
|
|
|
|
|
IOleInPlaceObject::SetObjectRects?
CodeGuy
http://groups.yahoo.com/group/wtl
|
|
|
|
|
Hi,
Anybody know how to programmatically move a windowless control to a fixed location (e.g. top-left corner) on a VB form, after it is being created on the VB form?
I can do this with windowed control, by calling IOleInPlaceSite::OnPosRectChange() in OnCreate() function for the windowed control.
Since windowless control does not handle WM_CREATE message, at which function can I request the control to reposition itself using IOleInPlaceSite::OnPosRectChange()?
Any idea/hint to share?
|
|
|
|
|
I’m creating a Browser Helper Object in VC++ 6.0 which is attempting to open a blank window, “about:blank”, by passing an empty string for the URL parameter in
ITHTMLWindow2::open . On a Windows 95 machine, using Internet Explorer 5.00 (or 5.01 SP2) a new window is opened; but, instead of being blank it has a title “No page to display” and window contents of “Action canceled. Internet Explorer was unable to link to the Web page you requested. The page might be temporarily unavailable.”
As expected, a simple HTML file with the equivalent javascript works correctly with IE 5.0.
When I upgrade to Internet Explorer 5.5, the problem vanishes.
Any ideas how I can get ‘open’ to work on Internet Explorer 5.0 or does some workaround exist? I’m opening a blank URL because I would like the IHTMLWindow2 reference to the named window if it exits. If it doesn’t exist, I’ll then go ahead an open the required window.
Thanks, in advance, for any help you can provide.
|
|
|
|
|
Have you tried using about:blank as the URL instead of the empty string?
|
|
|
|
|
I guess I should have made it more clear that the reason I was passing a blank string to open was to check to see if the named window already exists. If it exists, I need to get the IHTMLWindow2 reference to it.
By passing "about:blank" to the existing browser window, I'll cause the current page in the target window to be unloaded.
Interesting enough, if I do use "about:blank", I get "access denied" when querying the returned window.location.href. This code works perfectly in Internet Explorer 5.5 and I can do the same thing in javascript with no problem.
Can anyone else reproduce this problem or is it something with my system?
A search of msdn didn't turn up any previous reports of this problem.
|
|
|
|
|
Does anyone have a good reference or link to how to make a call from an ATL object into a plain old compiled dll? I have a dll, the .lib file and some documentation.
It seems to work when I launch the test container app from within VC++ but not when I run the test container app straight from windows.
What kind of issues would I be facing here? Is this some kind of threading issue?
|
|
|
|
|
I have created an ATL project, inserted a Simple Object and an ATL Dialog via the ATL Object Wizard. Everything works great except for one thing. I don't have an interface to the Dialog. So, my client app can't interface with my dialog. The only thing I can do is get the interface, run the function ShowWindow() which displays my dialog as a modal dialog. I wanted my dialog to invoke a function in the client app when the user clicked a button, but since I don't have an interface or any COM object whatsoever for my dialog I can't. I tried to do it by creating an interface to my Simple Object in my code for clicking the button on the dialog. But, that doesn't work because I don't have the same interface that the client Advise()d. So, the event never gets to the client.
I'm trying desperatly to find a way to be able to interface with my ATL dialog using COM. Any help would be greatly appreciated.
|
|
|
|
|
Yes, this can be done. The dialogs you get from the ATL Wizard are just normal dialogs, but are not COM objects. Create a simple object called CMyDialogObject or whatever. Create the dialog, called CMyDialog. Embed an instance of the dialog into the simple object as a member variable, and create wrapper functions on the simple object's interface to expose whichever CDialogImpl methods you need, maybe just a DoModal for a modal dialog, or Create and Destroy for a modeless dialog. In the body of the wrapper methods, just delegate to the contained dialog instance.
You will need to use the BEGIN_MSG_MAP macro to handle windows messages, commands, etc. in your dialog class. If your dialog class contained a pointer to your simple object, it could delegate to the Fire_XXX method in the message handlers, which would cause the ATL event to fire.
Hope that helps
|
|
|
|
|
First time posting....let's begin
I have spent the last 2 days searching the net for examples\explaination for SAFEARRAY as a mean of transferring data. This is the problem:
Client: MFC
Server: ATL COM EXE
I would like the client to give the server an SQL command, and the server to execute it.
ExecuteSQL ([in] BSTR bsSQL,........)
Very straight forward for commands such as:
"Delete from tblMyTable <where clause="">,,,,"
"Insert into tblMyTable VALUES (,,,,,)" ->you get what i mean.
However, i want the server to be able to execute commands such as
"Select * from tblMyTable". This is where a second parameter comes into the function
ExecuteSQL ([in]BSTR bsSQL, [out] VARIANT * Var,..)
I have read and re-read about safearrays, but the samples i c are good for cases where i know the size of the data i have.
Let's ASSUME (i only know this at run time) that I have a recordset of 5 columns (Fields) and 6 rows (any numbers would do as long as it is greater than 2!!!).
Can someone pls explain to me how I construct the safearray??? (PLEASE). I tried a certain method, and it seemed to work to the point where i get back to the client and on attemtping to get elements receive an "invalid index".
What i thought of doing is:
1) Declare an array of NumRows SAFEARRAYBOUND(s)
2) Each arraybound has NumFields elements (so in my case i get a 6x5 array)
3) Call SafeArrayCreate with VT_VARIANT, NumRows and the array of
safearraybounds.
4) I set the variant's type to be VT_VARIANT | VT_ARRAY
5) I declare a long Dimension[2] array to help me place the values I read
from the recordset into the 6x5 Variant array
6) I use two "for" loops to iterate through the rowsets and their fields
for (RowIndex (0);RowIndex<rowcount &&="" !rs.iseof()="" ;rowindex++)
{
="" for="" (fieldindex(0);fieldindex="" <="" fieldcount;="" fieldindex++)
="" {
="" ccomvariant="" var;
="" var="rs.Field(FieldIndex);
" dimension[1]="FieldIndex;
" dimension[0]="RowIndex;"
="" safearrayputelement(psafearr-="">parray, lDimension,&Var);
}
rs.MoveNext();
}
7) This copies all the data into the array.
8) I return to the client, get the safearray from the VARIANT, get the dims
param (yes, it is 6 <smile>) and lower(0)\upper (4) bound.
9) I declare again Dimension[2] in the client, and attempt to read the
first element (0,0) from the safearray using SafeArrayGetElement,
and......"invalid index"
10) * What am i doing wrong??
* I am using an IUnknown for the interface and define oleautomation in
the idl), will IDispatch make any difference (tried,but maybe forgot
something)
|
|
|
|
|
Hi,
I am trying to implement an edit host (IHTMLEditHost).
According to the msdn documentation the host of the browser control has to implement the IServiceProvider.
What is the Host? The CHtmlView class?
I looked at the ATL example (EditHost.exe at msdn), and tried to implement the
IServiceProvider interface in the CHtmlView class. But this doesn't work.
The interface function QueryService is not called after
activating the editor (spDoc->put_designmode(L"On").
Does anyone have any idea how to do this?
Thanks,
Jurgen Wolke
.
|
|
|
|
|
Hi,
I'm trying to get info out of a typelib at runtime, using the ITypeLib interface returned from a GetTypeLib(...) call. I'm having trouble with the enums in the typelib. I'd like to be able to get the names of members of the enum and their helpstrings at run time from the ITypeInfo interface for the enum. I can get the name of the enum itself, but can't get anything inside of it. Here's the code I'm tryin to use:
ITypeLib* pTypeLib = NULL;
ITypeInfo* pTypeInfo = NULL;
hr = LoadTypeLib(path, &pTypeLib);
if(SUCCEEDED(hr))
{
// Get info about the typelib itself
BSTR bstrName, bstrDocString, bstrHelpFile;
DWORD dwHelpContext;
pTypeLib->GetDocumentation(-1, &bstrName, &bstrDocString, &dwHelpContext, &bstrHelpFile);
name = bstrName;
docString = bstrDocString;
helpFile = bstrHelpFile;
fprintf(log, "\n--TypeLib information for <%s> -- ", (char*)path);
fprintf(log, "\nName: %s", (char*)name);
fprintf(log, "\nDocString: %s", (char*)docString);
fprintf(log, "\nHelpFile: %s", (char*)helpFile);
fprintf(log, "\n\n");
SysFreeString(bstrName);
SysFreeString(bstrDocString);
SysFreeString(bstrHelpFile);
UINT count = pTypeLib->GetTypeInfoCount();
for(int i = 0; i < count; i++)
{
hr = pTypeLib->GetTypeInfo(i, &pTypeInfo);
if(SUCCEEDED(hr))
{
// Examine the type info for this thingy
// Get documentation about the interface/struct/etc
pTypeInfo->GetDocumentation(-1, &bstrName, &bstrDocString, &dwHelpContext, &bstrHelpFile);
name = bstrName;
docString = bstrDocString;
helpFile = bstrHelpFile;
fprintf(log, "\n--TypeLib information for typelib member # <%i> -- ", i);
fprintf(log, "\nName: %s", (char*)name);
fprintf(log, "\nDocString: %s", (char*)docString);
fprintf(log, "\nHelpFile: %s", (char*)helpFile);
// Type attributes
TYPEATTR* pTypeAttr = NULL;
pTypeInfo->GetTypeAttr(&pTypeAttr);
int j = 0;
switch(pTypeAttr->typekind)
{
case TKIND_COCLASS: fprintf(log, "\ntypekind = TKIND_COCLASS");
break;
case TKIND_ALIAS: fprintf(log, "\ntypekind = TKIND_ALIAS");
break;
case TKIND_DISPATCH: fprintf(log, "\ntypekind = TKIND_DISPATCH");
fprintf(log, "\ncFuncs = %i", pTypeAttr->cFuncs);
while(j < pTypeAttr->cFuncs)
{
pTypeInfo->GetDocumentation(j, &bstrName, &bstrDocString, &dwHelpContext, &bstrHelpFile);
name = bstrName;
docString = bstrDocString;
helpFile = bstrHelpFile;
fprintf(log, "\n--TypeLib information for typelib submember # <%i> -- ", j);
fprintf(log, "\nName: %s", (char*)name);
fprintf(log, "\nDocString: %s", (char*)docString);
fprintf(log, "\nHelpFile: %s", (char*)helpFile);
// Release strings and stuff
SysFreeString(bstrName);
SysFreeString(bstrDocString);
SysFreeString(bstrHelpFile);
j++;
}
break;
case TKIND_ENUM: fprintf(log, "\ntypekind = TKIND_ENUM");
fprintf(log, "\ncVars = %i", pTypeAttr->cVars);
// Enumerate the constants and get doc.
while(j < pTypeAttr->cVars)
{
// ***This next line fails***
hr = pTypeInfo->GetDocumentation(j, &bstrName, &bstrDocString, &dwHelpContext, &bstrHelpFile);
name = bstrName;
docString = bstrDocString;
helpFile = bstrHelpFile;
fprintf(log, "\n--TypeLib information for enum submember # <%i> -- ", j);
fprintf(log, "\nName: %s", (char*)name);
fprintf(log, "\nDocString: %s", (char*)docString);
fprintf(log, "\nHelpFile: %s", (char*)helpFile);
// Release strings and stuff
SysFreeString(bstrName);
SysFreeString(bstrDocString);
SysFreeString(bstrHelpFile);
j++;
}
break;
case TKIND_INTERFACE: fprintf(log, "\ntypekind = TKIND_INTERFACE");
break;
case TKIND_MAX: fprintf(log, "\ntypekind = TKIND_MAX");
break;
case TKIND_MODULE: fprintf(log, "\ntypekind = TKIND_MODULE");
break;
case TKIND_RECORD: fprintf(log, "\ntypekind = TKIND_RECORD");
break;
case TKIND_UNION: fprintf(log, "\ntypekind = TKIND_UNION");
break;
default:
fprintf(log, "\nUnrecognized type kind.");
}
pTypeInfo->ReleaseTypeAttr(pTypeAttr);
// Release strings and stuff
SysFreeString(bstrName);
SysFreeString(bstrDocString);
SysFreeString(bstrHelpFile);
pTypeInfo->Release();
fprintf(log, "\n\n");
}
}
And here is the declaration of the enum (from a larger typelib) that I am trying to get some info about:
// Options for calculating roughness correction factor for PSW [helpstring("Roughness Correction Factor Calculation Options") ]
typedef enum
{
[ helpstring("No roughness correction applied") ]
ROUGHNESS_NONE,
[ helpstring("Viscosity based correction factor") ]
ROUGHNESS_VISCOSITY,
[ helpstring("Reynold's number based correction factor") ]
ROUGHNESS_REYNOLDS
} RoughnessCFOption;
I am getting a failure on the call to get documentation for each of the members of the struct. So maybe I should be usin a different call here?
Thanks in advance for any help.
Aaron
|
|
|
|
|
Seems I've answered my own question.
The offending section revised now seems to be working:
case TKIND_ENUM: fprintf(log, "\ntypekind = TKIND_ENUM");
fprintf(log, "\ncVars = %i", pTypeAttr->cVars);
// Enumerate the constants and get doc.
while(j < pTypeAttr->cVars)
{
hr = pTypeInfo->GetVarDesc(j, &pVarDesc);
hr = pTypeInfo->GetDocumentation(pVarDesc->memid, &bstrName, &bstrDocString, &dwHelpContext, &bstrHelpFile);
pTypeInfo->ReleaseVarDesc(pVarDesc);
name = bstrName;
docString = bstrDocString;
helpFile = bstrHelpFile;
fprintf(log, "\n--TypeLib information for enum submember # <%i> -- ", j);
fprintf(log, "\nName: %s", (char*)name);
fprintf(log, "\nDocString: %s", (char*)docString);
fprintf(log, "\nHelpFile: %s", (char*)helpFile);
// Release strings and stuff
SysFreeString(bstrName);
SysFreeString(bstrDocString);
SysFreeString(bstrHelpFile);
j++;
}
break;
|
|
|
|
|
My class is from the Lite Control wizard. I am trying to do some clipboard stuff so I would like to set up a timer to periodiacally poll the clipboard. I have added a WM_CREATE handler to set up the timer but it never seems to get called.
Therefore, I tried moving the timer code into the constructor and FinalConstruct() and in both places, I get an ASSERT because m_hWnd is not set up. Now, I know that CComControl derives from CWindowImpl which derives from CWindow and sure enough there is an m_hWnd member there. The debugger says it is unused.
I don't want to create a dummy window with a separate message map just to have a timer or be inserted into the clipboard chain, however I can't get the m_hWnd member to be valid. Do I have to inherit the container's property or something? Has anyone here done this before?
-pos
|
|
|
|
|
I'm going to reply to my own thread again.
I turns out that WM_CREATE doesn't get called because the m_hwnd member is not a real window. When you create the project, just select "windowed only" and your component will only work in windowed containers. but wil in fact work
-pos
|
|
|
|
|
Hay
reading a lot about shell extentions, i still didn't find a way to extend Explorer by "catching" file selection (LEFT click on a file ) and do something in response to it.
any ideas how to do it?
(ho, and FileManager Extentions are only for Win3.11 ?)
|
|
|
|
|
I am writing a function that need to return a variant data type ,some times string sometimes integral and so on.so I declare a variale with a VARIANT data type but I chocked when I know that I must determine wich type of variant before I use it(VT_U8,VT_I and ...).
I thought it is like a Variant type in Visual Basic.
So can any body tell me how can do that.
M.S.
|
|
|
|
|
use this variant crack.. This is gives you an idea of how to use a variant
CString CLeftView::CrackStrVariant(const COleVariant& var)
{
CString strRet;
strRet = _T("<Unknown>");
switch(var.vt)
{
case VT_EMPTY:
case VT_NULL:
strRet = _T("NULL");
break;
case VT_I2:
strRet.Format(_T("%hd"), V_I2(&var));
break;
case VT_I4:
strRet.Format(_T("%d"),V_I4(&var));
break;
case VT_R4:
strRet.Format(_T("%e"), (double)V_R4(&var));
break;
case VT_R8:
strRet.Format(_T("%e"), V_R8(&var));
break;
case VT_CY:
strRet = COleCurrency(var).Format();
break;
case VT_DATE:
strRet = COleDateTime(var).Format(_T("%c"));
break;
case VT_BSTR:
strRet = V_BSTR(&var);
break;
case VT_DISPATCH:
strRet = _T("VT_DISPATCH");
break;
case VT_ERROR:
strRet = _T("VT_ERROR");
break;
case VT_BOOL:
return ( V_BOOL(&var) ? _T("TRUE") : _T("FALSE"));
case VT_VARIANT:
strRet = _T("VT_VARIANT");
break;
case VT_UNKNOWN:
strRet = _T("VT_UNKNOWN");
break;
case VT_I1:
strRet = _T("VT_I1");
break;
case VT_UI1:
strRet.Format(_T("0x%02hX"), (unsigned short)V_UI1(&var));
break;
case VT_UI2:
strRet = _T("VT_UI2");
break;
case VT_UI4:
strRet = _T("VT_UI4");
break;
case VT_I8:
strRet = _T("VT_I8");
break;
case VT_UI8:
strRet = _T("VT_UI8");
break;
case VT_INT:
strRet = _T("VT_INT");
break;
case VT_UINT:
strRet = _T("VT_UINT");
break;
case VT_VOID:
strRet = _T("VT_VOID");
break;
case VT_HRESULT:
strRet = _T("VT_HRESULT");
break;
case VT_PTR:
strRet = _T("VT_PTR");
break;
case VT_SAFEARRAY:
strRet = _T("VT_SAFEARRAY");
break;
case VT_CARRAY:
strRet = _T("VT_CARRAY");
break;
case VT_USERDEFINED:
strRet = _T("VT_USERDEFINED");
break;
case VT_LPSTR:
strRet = _T("VT_LPSTR");
break;
case VT_LPWSTR:
strRet = _T("VT_LPWSTR");
break;
case VT_FILETIME:
strRet = _T("VT_FILETIME");
break;
case VT_BLOB:
strRet = _T("VT_BLOB");
break;
case VT_STREAM:
strRet = _T("VT_STREAM");
break;
case VT_STORAGE:
strRet = _T("VT_STORAGE");
break;
case VT_STREAMED_OBJECT:
strRet = _T("VT_STREAMED_OBJECT");
break;
case VT_STORED_OBJECT:
strRet = _T("VT_STORED_OBJECT");
break;
case VT_BLOB_OBJECT:
strRet = _T("VT_BLOB_OBJECT");
break;
case VT_CF:
strRet = _T("VT_CF");
break;
case VT_CLSID:
strRet = _T("VT_CLSID");
break;
}
WORD vt = var.vt;
if(vt & VT_ARRAY)
{
vt = vt & ~VT_ARRAY;
strRet = _T("Array of ");
}
if(vt & VT_BYREF)
{
vt = vt & ~VT_BYREF;
strRet += _T("Pointer to ");
}
if(vt != var.vt)
{
switch(vt)
{
case VT_EMPTY:
strRet += _T("VT_EMPTY");
break;
case VT_NULL:
strRet += _T("VT_NULL");
break;
case VT_I2:
strRet += _T("VT_I2");
break;
case VT_I4:
strRet += _T("VT_I4");
break;
case VT_R4:
strRet += _T("VT_R4");
break;
case VT_R8:
strRet += _T("VT_R8");
break;
case VT_CY:
strRet += _T("VT_CY");
break;
case VT_DATE:
strRet += _T("VT_DATE");
break;
case VT_BSTR:
strRet += _T("VT_BSTR");
break;
case VT_DISPATCH:
strRet += _T("VT_DISPATCH");
break;
case VT_ERROR:
strRet += _T("VT_ERROR");
break;
case VT_BOOL:
strRet += _T("VT_BOOL");
break;
case VT_VARIANT:
strRet += _T("VT_VARIANT");
break;
case VT_UNKNOWN:
strRet += _T("VT_UNKNOWN");
break;
case VT_I1:
strRet += _T("VT_I1");
break;
case VT_UI1:
strRet += _T("VT_UI1");
break;
case VT_UI2:
strRet += _T("VT_UI2");
break;
case VT_UI4:
strRet += _T("VT_UI4");
break;
case VT_I8:
strRet += _T("VT_I8");
break;
case VT_UI8:
strRet += _T("VT_UI8");
break;
case VT_INT:
strRet += _T("VT_INT");
break;
case VT_UINT:
strRet += _T("VT_UINT");
break;
case VT_VOID:
strRet += _T("VT_VOID");
break;
case VT_HRESULT:
strRet += _T("VT_HRESULT");
break;
case VT_PTR:
strRet += _T("VT_PTR");
break;
case VT_SAFEARRAY:
strRet += _T("VT_SAFEARRAY");
break;
case VT_CARRAY:
strRet += _T("VT_CARRAY");
break;
case VT_USERDEFINED:
strRet += _T("VT_USERDEFINED");
break;
case VT_LPSTR:
strRet += _T("VT_LPSTR");
break;
case VT_LPWSTR:
strRet += _T("VT_LPWSTR");
break;
case VT_FILETIME:
strRet += _T("VT_FILETIME");
break;
case VT_BLOB:
strRet += _T("VT_BLOB");
break;
case VT_STREAM:
strRet += _T("VT_STREAM");
break;
case VT_STORAGE:
strRet += _T("VT_STORAGE");
break;
case VT_STREAMED_OBJECT:
strRet += _T("VT_STREAMED_OBJECT");
break;
case VT_STORED_OBJECT:
strRet += _T("VT_STORED_OBJECT");
break;
case VT_BLOB_OBJECT:
strRet += _T("VT_BLOB_OBJECT");
break;
case VT_CF:
strRet += _T("VT_CF");
break;
case VT_CLSID:
strRet += _T("VT_CLSID");
break;
}
}
return strRet;
}
|
|
|
|
|
Maybe the helper classes CComVariant & _variant_ can help you ? I don't know if I understand your question correct ? Is this an answer to your question ?
-Nick-
|
|
|
|
|
This piece of code works when i instantiate an object as 'inproc':
MULTI_QI qi[2] = {0};
qi[0].pIID = &IID_IAgentCore;
qi[1].pIID = &IID_IConnectionPointContainer;
hr = CoCreateInstanceEx(
CLSID_AgentCore, NULL,
server_type, pServerInfo,
2, qi);
IConnectionPointContainerPtr pCPC_AgentCore;
...
pCPC_AgentCore = (IConnectionPointContainer*)qi[1].pItf;
...
hr = pCPC_AgentCore->FindConnectionPoint(IID__IAgentCoreEventsFlat, &m_pCoreEvents);
if ( SUCCEEDED( hr ) )
{
hr = m_pCoreEvents->Advise(GetUnknown(), &m_CoreCookie);
if ( FAILED( hr ) )
throw hr;
}
else
throw hr;
but when the object AgentCore is on the remote computer Advise() failes with 'Access denied' error. Note that object is created and other method calls were successful. So i dont think it is a security problem...
IAgentCoreEventsFlat is an ordinary interface inherited from IUnknown. I'm launching a DLL with the help of DLLHOST.EXE on remote machine.
Please help!
Thanks.
|
|
|
|
|