|
Define some method of default IPlot2D interface which will return the IMIDraw interface.
<br />
In idl:<br />
[propget] HRESULT DrawManager([out,retval]IMIDraw ** ppDraw)
In C++:<br />
STDMETHODIMP HRESULT CPlot2D::DrawManager(IMIDraw ** ppDraw)<br />
{<br />
return QueryInterface(IID_IMIDraw,(void**)ppDraw);<br />
}
<br />
In VB:<br />
Dim o As Plot2D, o2 As IMIDraw<br />
Set o = CreateObject("PlotLib.Plot2D") ' or = New Plot2D<br />
Set o2 = o.DrawManager<br />
o2.Plot<br />
' Or<br />
o.DrawManager.Plot
<br />
In VBScript:<br />
Dim o, o2<br />
Set o = CreateObject("PlotLib.Plot2D")<br />
Set o2 = o.DrawManager <br />
o2.Plot<br />
' Or<br />
o.DrawManager.Plot
With best wishes,
Vita
|
|
|
|
|
You can't have 2 IDispatch interface on one COM object.
--
Only in a world this sh*tty could you even try to say these were innocent people and keep a straight face.
|
|
|
|
|
QueryInterface
~~~~Code the Dreams~~~~~
|
|
|
|
|
As the title, how can I perform that with programmatically?
My Com+ plus is inherited from ServicedComponent and implements
an interface(dual) defining by myself. Thanks ahead!
|
|
|
|
|
You can do it either by hand ( open Component Sevices console, etc) or programatically , using COMAdminCatalog component.
|
|
|
|
|
I know some of COMAdminCatalog, but i have no idea of those properties which are the correct ones to set. I set RemoteServerName and it really be set on the Com+ database but does not effect somewhat.
|
|
|
|
|
I have never ever worked with a SafeArray, and I have a few problems using it
I have this line in my code:
SAFEARRAY *sa = kvset->GetKVSetArray(L"results");
where kvset is a COM Object.
My problem is that I know that the SafeArray sa contains IDispatch* interfaces.
But I cannot get a interface, and make a successfull QueryInterface on it...
Anuone have a couple of lines of code that does the trick?
- Anders
Money talks, but all mine ever says is "Goodbye!"
|
|
|
|
|
If that's a IDispatch*, then you might just as well end up with an Invoke method call. At least, that's what the IDispatch interface is for.
|
|
|
|
|
But how... Please...
Sorry to ask, but I have used the last 6 hours trying to get this stuff to work, and right now my brain has almost stopped working
This is the first time I have ever worked with a SafeArray, and it really baffles me
- Anders
Money talks, but all mine ever says is "Goodbye!"
|
|
|
|
|
if anyone is interested, this did the trick
SAFEARRAY *pSafeArray = kvset->GetKVSetArray(L"results");
IDispatch** pIDispatch;
SafeArrayAccessData(pSafeArray, (void**)&pIDispatch);
IKVSet *test;
pIDispatch[0]->QueryInterface(__uuidof(IKVSet), (void**)&test);
SafeArrayUnaccessData(pSafeArray);
test->Release();
- Anders
Money talks, but all mine ever says is "Goodbye!"
|
|
|
|
|
Hi dear,
I'm looking for an article or sample, demonstrates using Office xp(2000) Chart in a VC++ or C# project.
Thank you in advance.
|
|
|
|
|
In Client program CoCreateInstanceEx returns 0x80040154 - "Class not registered" even though the class is registered. Also OLE/COM Viewer is not showing me the object (only typelib). My server is .exe and is 'Attributed'. Also noticed that when creating a non-attributed ATL server project , class can be seen in OLE/COM Viewer, but it doesn't expose custom interfaces (only IUnknown, IClientSecurity, IMultiQI and IMarshal).
Can anybody help me out here?
|
|
|
|
|
try to unregister your ATL.dll and re register that...
~~~~Code the Dreams~~~~~
|
|
|
|
|
i've got the same problem.
I created a regular COM object with ATL, it worked fine by using the CoCreateInstance(), and then install the COM object to a COM+ application with Component Services administrative tool, when I try to call CoCreateInstance in my client code, I got "no such interface supported" error, the returned HRESULT is E_NOINTERFACE. But if I delete the object from COM+ application, and just register the component with regsvr32 command, my client works, again. Anything I have missed when I installed the component into the COM+ application?
|
|
|
|
|
My DCOM server (developed in VC++ NET) can not access file system (eg. create files, etc...) but he runs on administrator account. Can anyone tell me why ?
|
|
|
|
|
If you mean system account (for example as a service), this is by default. You have to enable rights or work as another user to access file system
|
|
|
|
|
Hello,
I want to know if there is any way to get an handle to PopUp box / Alert box.
These alert's are mostly displayed by Javascript functions on a webpage display.
I have a Webbrowser Control in my C++ application(mfc) and need to know when the Alert box is shown and also what was the user's action on it(He/she might click OK or Cancel button).
Thanking you in advance.
Prasad
|
|
|
|
|
hi,
I'm developing ATL ActiveX EXE server that runs as a Window services using ATL wizard.
This server contains one ATL object (CTest).
How I can set the server so that when it started (via Window Services Applet), the server will :
1) initiate/create CTest.
2) Call method/function in this ATL object (CallMe).
3) destroy CTest when server stopped.
Thanx in advance.
Regards.
|
|
|
|
|
You will need to overwrite CServiceModule::Run - after the service will register the class objects, init your object and call the method. After the message loop sequence, destroy your object.
|
|
|
|
|
hi,
thanx for ur replay
I've change my code. But when I try to start my service I got an error :
Could not start the Test on Local Computer.
Error 1053: The service did not respond to the start or control request
in a timely fashion.
And one more thing; how i want to destroy the ATL object in a correct way:
m_Obj->Release()
or
m_Obj = NULL
Below is code for CServiceModule::Run() :
<small>void CServiceModule::Run()<br />
{<br />
_Module.dwThreadID = GetCurrentThreadId();<br />
<br />
HRESULT hr = CoInitialize(NULL);<br />
<br />
_ASSERTE(SUCCEEDED(hr));<br />
<br />
CSecurityDescriptor sd;<br />
sd.InitializeFromThreadToken();<br />
hr = CoInitializeSecurity(sd, -1, NULL, NULL,<br />
RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);<br />
_ASSERTE(SUCCEEDED(hr));<br />
<br />
hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE);<br />
_ASSERTE(SUCCEEDED(hr));<br />
<br />
<big>
CComObject<CMyObj> *m_Obj;<br />
CComObject<CMyObj>::CreateInstance(&m_Obj);</big><br />
<br />
<big>
m_Obj->CallMe();</big><br />
<br />
LogEvent(_T("Service started"));<br />
if (m_bService)<br />
SetServiceStatus(SERVICE_RUNNING);<br />
<br />
MSG msg;<br />
while (GetMessage(&msg, 0, 0, 0))<br />
DispatchMessage(&msg);<br />
<br />
<big>
m_Obj->Release();</big><br />
<br />
_Module.RevokeClassObjects();<br />
<br />
CoUninitialize();<br />
}</small>
Below is code for CMyObj :
<small>HRESULT CMyObj::FinalConstruct()<br />
{<br />
return S_OK;<br />
}<br />
<br />
void CMyObj::FinalRelease()<br />
{<br />
<br />
}<br />
<br />
<big>STDMETHODIMP CMyObj::CallMe()<br />
{<br />
MessageBox(NULL, "Window services called me.", "MyObj", MB_OK);<br />
return S_OK;<br />
}</big></small>
Sorry for the silly questions.
Thanx in advance.
Regards.
|
|
|
|
|
NT Services are running into a window station which is not interactive, so they cannot have a user interface - your service will be blocked at MessageBox call from CallMe method. Try to write something to the debug output instead. To release the object call Release ( setting the smart ptr to NULL will NOT dereference the object), or use CComObjectStack instead of CComObject, since your object is used only in Run method.
ps. If you really want, you can change your service to interact with the active desktop ( to have a user interface ), by using service_interactive flag when you call CreateService.
|
|
|
|
|
Or if you really want to use the messagebox inside the service, really only for debugging purposes or something like that, you can use the MB_SERVICE_NOTIFICATION flag for the messagebox function
<br />
MessageBox( NULL, "some message", NULL, MB_OK | MB_SERVICE_NOTIFICATION );<br />
This will pop-up the message box on the default desktop.
Assigining a NULL value to the smart pointer is also a correct way of releasing the pointer - if you look into the implementation of CComPtr, it will first call release on currently assigned pointer and then attaches to the new one. This is a must for correctly working = operator, so I guess it is valid for each com smart pointer. Then if you assign NULL, it will first call the Release and then stores your NULL value.
|
|
|
|
|
You are right - assigning NULL to a CComPtr instance will dereference the contained interface. Thanks!
|
|
|
|
|
hi,
When I call m_Obj->Release() or m_Obj = NULL; my FinalRelease() never called
void CServiceModule::Run()<br />
{<br />
_Module.dwThreadID = GetCurrentThreadId();<br />
<br />
HRESULT hr = CoInitialize(NULL);<br />
<br />
_ASSERTE(SUCCEEDED(hr));<br />
<br />
CSecurityDescriptor sd;<br />
sd.InitializeFromThreadToken();<br />
hr = CoInitializeSecurity(sd, -1, NULL, NULL,<br />
RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);<br />
_ASSERTE(SUCCEEDED(hr));<br />
<br />
hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE);<br />
_ASSERTE(SUCCEEDED(hr));<br />
<br />
CComObject<CMyObj> *m_Obj;<br />
CComObject<CMyObj>::CreateInstance(&m_Obj);<br />
<br />
m_Obj->CallMe();<br />
<br />
LogEvent(_T("Service started"));<br />
if (m_bService)<br />
SetServiceStatus(SERVICE_RUNNING);<br />
<br />
MSG msg;<br />
while (GetMessage(&msg, 0, 0, 0))<br />
DispatchMessage(&msg);<br />
<br />
<big>
m_Obj->Release();</big> <br />
<br />
_Module.RevokeClassObjects();<br />
<br />
CoUninitialize();<br />
}<br />
Below is .h code for CMyObj :
<br />
<br />
#ifndef __MYOBJ_H_<br />
#define __MYOBJ_H_<br />
<br />
#include "resource.h"
<br />
class ATL_NO_VTABLE CMyObj : <br />
public CComObjectRootEx<<CComSingleThreadModel>>,<br />
public CComCoClass<<CMyObj, &CLSID_MyObj>>,<br />
public IDispatchImpl<<IMyObj, &IID_IMyObj, &LIBID_TESTLib>><br />
{<br />
public:<br />
CMyObj()<br />
{<br />
}<br />
<br />
HRESULT FinalConstruct()<br />
{<br />
MessageBox(NULL, "Start", NULL, MB_OK | MB_SERVICE_NOTIFICATION );<br />
return S_OK;<br />
}<br />
<br />
<big><br />
void FinalRelease()<br />
{<br />
MessageBox(NULL, "stop", NULL, MB_OK | MB_SERVICE_NOTIFICATION);<br />
}</big><br />
<br />
DECLARE_REGISTRY_RESOURCEID(IDR_MYOBJ)<br />
<br />
DECLARE_PROTECT_FINAL_CONSTRUCT()<br />
<br />
BEGIN_COM_MAP(CMyObj)<br />
COM_INTERFACE_ENTRY(IMyObj)<br />
COM_INTERFACE_ENTRY(IDispatch)<br />
END_COM_MAP()<br />
<br />
public:<br />
STDMETHOD(CallMe)();<br />
};<br />
<br />
#endif //__MYOBJ_H_<br />
Thanx in advance
Regards.
|
|
|
|
|
hi all,
i am stuck.please help. my problem is I want to make a setup program for my vc++ application as we have in VB.can anyone help me out?
thanks in advance
regards
Himanshu
|
|
|
|
|