|
There's a few things you need to take into account.
Your COM object's interface that you're trying to reach... did you implement it using IUnknown or IDispatch? IUnknown will let you more or less pass any kind of data you want including good 'ol CHAR and CHAR* type stuff. IDispatch, which is required if your component is or ever will be used in Visual Basic or any scripting language (JavaScript or VB Script), is much more limited. From my experience and I don't doubt some will disagree, IDispatch is "safer" in most cases regardless of whether your object is needed in VB or not (particularly if you have to support Windows 95/98). IDispatch, however, greatly narrows down your options to a degree on types. Sure, there's ways around this restriction, but basically with IDispatch you have some basic integer types... after that you really have to use BSTR's and VARIANT's. These are a real pain in the... keister, particularly in C++ but you'll have better results.
The solution using SysAllocString mentioned above would be the correct usage if you're using IDispatch and passing a BSTR. I'm gathering from the type you mentioned that you chose IUnknown.
In this case, it's really quite simple,
CString strData("Hello World");
// Load your smart pointer to your object
IMyInterfacePtr pInterface;
HRESULT hr = pInterface.CreateInstance(__uuidof(MyCoClass));
if (SUCCEEDED(hr))
{
hr = pInterface->YourFunctionCall(strData.GetBuffer(strData.GetLength()));
if (SUCCEEDED(hr))
{
}
else
{
}
strData.ReleaseBuffer();
}
|
|
|
|
|
The CString object exposes exactly that datatype as a cast, so do the following:
myobjectvariable.myobjectmethod((LPCTSTR) myCString, ...);
Should do the trick, hope it helps.
Simon
|
|
|
|
|
DLL-based Component CA is developed with ATL Object wizard. Its features including:
1. single-threaded
2. custom interface
3. no aggregation support
CA has only one interface named IA which has a method GetData:
STDMETHOD(Receive)(/*[out]*/ long* pDataLength,
/*[out, size_is(*pDataLength)]*/ unsigned char** ppData);
A confusing fact is that:
When I use CA in a normal MFC EXE, it works well.
Then I use CA in an ATL-based EXE. In that EXE I have another Componet say CB.
CB creates a thread say WorkingThread().
In WorkingThread(), I call CreateInsantance() to create CA:
IA* pIA = NULL;
RESULT hr = CoCreateInstance(CLSID_A, NULL, CLSCTX_INPROC_SERVER,
IID_IA,
(void**)&pIA);
It failed with a HRESULT indicating "The interface IA is not supported by CLSID_A".
I have included A.h and two const definition of CLSID_A and IID_A in the ATL EXE's source,
the same as I did in the normal MFC EXE.
If CA is a dual interface, no such troubles. So I assume this is related to custom interface.
But how to solve this problem?
|
|
|
|
|
You need to make sure that you call CoInitailize for each thread that will create COM objects.
Basically this function inidicates to OLE which type of threading model that thread will use when it creates COM objects.
Build a man a fire, and he will be warm for a day Light a man on fire, and he will be warm for the rest of his life!
|
|
|
|
|
I need to fire events from a DCOM server once in a time interval.
Do you have any idea about how should i implement this or at least do you know some tutorial that solves such a task?
rechi
|
|
|
|
|
Is your server a service?
In that case, you can use a separate worker thread in your
application to do the needful. The timing action can be
implemented using Events and the thread has to be
synchronised with that event. The event will signal the
thread when the required time has elapsed.
With best regards,
Sayan
Email:sayanmukherjee@indiatimes.com
|
|
|
|
|
Dear all:
I have programmed a toolband(.dll) by C++.But I don't know How to uninstall a component(.dll) by C++.
please give me some advice or examples
Thank you for your help
|
|
|
|
|
regsvr32 dllname.dll /u
from the command line
bryce
|
|
|
|
|
You are able to call DllRegisterServer and DllUnregisterServer toolband.DLL's functions or RegSvr32.exe [/u] toolband.DLL
With best wishes,
Vita
|
|
|
|
|
or simply swipe the IE toolband specific registry keys that you added?
#define MOSTLY_LEAN_AND_MEAN
|
|
|
|
|
Dear all:
I have installed a toolband(.dll) in IE in a web page by using Internet component download.But I don't know How to uninstall a component(.dll) in a web page.
please give me some advice or examples
Thank you for your help
|
|
|
|
|
Open up Explorer, go to \windows\Downloaded Program Files, find the one you want to remove, and hit the Delete key.
--Mike--
Actual sign at the laundromat I go to: "No tinting or dying"
Like the Google toolbar? Then check out UltraBar, with more features & customizable search engines!
My really out-of-date homepage
Big fan of Alyson Hannigan and Jamie Salé.
|
|
|
|
|
You can use Windows Shell script to swipe out the relevant registry keys?
#define MOSTLY_LEAN_AND_MEAN
|
|
|
|
|
I want to add popup menu button into a Explorer bar for IE, just like the history explorer bar in IE6. There are a "view" popup menu and a search button on the IE history explorer bar. By the way, is it possible to add a control(such as a treeview) to the window area of Explorer toolbar?
If you know how to do it, please help me, examples will be appreciated!
Thanks!
|
|
|
|
|
checkout
toolband -http://www.codeproject.com/useritems/toolband.asp
dropdown menu/toolbar-http://www.codeproject.com/wtl/toolbar.asp
and Bjarne Viksoe's website www.viksoe.dk for full code samples of explorer bars,toolbands etc.
#define MOSTLY_LEAN_AND_MEAN
|
|
|
|
|
Hi folks. I've created an ATL control that subclasses the standard treeview. It's very nice and I can host it in a web page and everything. The problem is when I resize the web page (with full window drawing as it's resized) I get a really bad flicker of the tree view. Something is causing my control to erase. I've tried suppressing WM_ERASEBKGND, but no good. When ATL resizes the main window of my control with SetWindowPos, it gets erased. If I make a windowless control (just using the default drawing from the wizard) I get flicker free resizing.
Does anyone know how I can get rid of flicker for the windowed control?
Thanks
Matt
|
|
|
|
|
I ve downloaded a Flash Com Objects from http://bukoo.sourceforge.net. I ve registered the dll. Then i imported the dll in VC. Please anyone explain how to use the COM object.
ThankYou
|
|
|
|
|
You will either need a header file that indicates the interfaces for the object, or the DLL needs to contain a typelibrary. If the DLL contains a type library you can use the #import command at the top of your file to automatically extract the data and create a header file for you. Look up the #import command in MSDN.
Build a man a fire, and he will be warm for a day Light a man on fire, and he will be warm for the rest of his life!
|
|
|
|
|
I ve downloaded a Flash Com Objects from http://bukoo.sourceforge.net. I ve registered the dll. Then i imported the dll in VC. Please anyone explain how to use the COM object.
ThankYou
|
|
|
|
|
Anonymous wrote: I ve downloaded a Flash Com Objects from http://bukoo.sourceforge.net. I ve registered the dll. Then i imported the dll in VC. Please anyone explain how to use the COM object.
I think you have to look for some beginner books
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow Never mind - my own stupidity is the source of every "problem" - Mixture
cheers,
Alok Gupta
VC Forum Q&A :- I/ IV
Support CRY- Child Relief and You
|
|
|
|
|
Dear all:
I generated a test certificate by the following command :
makecert -sk test1 -r -ss test.
I want to generate a real certificate,could you give me some advice.
thanks a lot.
liuage
|
|
|
|
|
I wrote a method in COM, has two parameters, BSTR bstrUserID and BSTR bstrUserPwd. I set type in SQL Server as varchar, I used stored procedure to execute a search in database.
Method:
STDMETHODIMP CStudentManager::LogOn(BSTR bstrUserID, BSTR bstrUserPwd)
{
// TODO: Add your implementation code here
BSTR UserID = ::SysAllocString(L"UserID");
BSTR UserPwd = ::SysAllocString(L"Passward");
VARIANT vUser, vPassword;
vUser.vt = VT_BSTR;
vUser.bstrVal = bstrUserID;
vPassword.vt = VT_BSTR;
vPassword.bstrVal = bstrUserPwd;
m_Comm->CommandText = L"LogOn";
HRESULT hr = AppendParameter(UserID, adChar, vUser, adParamInput,20);
if(SUCCEEDED(hr))
hr = AppendParameter(UserPwd, adChar, vPassword, adParamInput,20);
if(SUCCEEDED(hr))
m_Comm->Execute(pvtEmpty1, pvtEmpty2, adCmdText);
if(hr == 0)hr = S_OK;
else hr = E_FAIL;
m_Comm->Parameters->Release();
m_pRs->Close();
::SysFreeString(UserID);
::SysFreeString(UserPwd);
return hr;
}
Stored Procedure:
Create Procedure LogOn
(
@ID,
@Password
)
as
if EXISTS(Select userid from users where userid = @ID and userpwd = @Password
return 0
else
return 1
Go
I used a client function to logon: hr = pManager->LogOn(LogonID, LogonPwd);
I found the function can work, but always return E_FAIL even when database has userid and password.
I thought there is some wrong in define the type, but I can not find it out.
So could anyone tell me when I used BSTR in COM and varchar in SQL SERVER, what should i pay attention to ?
|
|
|
|
|
chq12 wrote:
BSTR UserID = ::SysAllocString(L"UserID");
...
HRESULT hr = AppendParameter(UserID, adChar, vUser, adParamInput,20);
...
Procedure LogOn(@ID,...
Is it the valid relation between "UserID" and "ID"? Is it the same parameter?
With best wishes,
Vita
|
|
|
|
|
Yes, it is. Should these two be same? I mean, if I use UserId in COM as the parameter name, so I should use @UserID in stored procedure. Is it right?
|
|
|
|
|
I think that they must be the same. Try it.
With best wishes,
Vita
|
|
|
|