|
From this blog post[^]:The ironic part is that the Windows common controls do have a workaround for this issue, even though there do not seem to be many areas of localized text in them. If you look at the topic entitled Localization Support for the Common Controls, it talks about the InitMUILanguage function (which initializes the UI language for the common controls within a process) and the GetMUILanguage function (which retrieves the UI language for the common controls within a process, or the user UI language if it has not been set). In theory there is no reason why you could not call this function at any point, but in practice it is unclear from the documentation if it will work when set multiple times (hell, I am still having trouble picturing when it works at all, since I cannot think of any localized text!).
--Mike--
Visual C++ MVP
LINKS~! Ericahist | NEW!! PimpFish | CP SearchBar v3.0 | C++ Forum FAQ
|
|
|
|
|
I export a class in dll examples
typedef vector<string> strvector;
class __declspec(dllexport) myclass()
{
void setvector(strvector &list);
}
void setvector(strvector &list)
{
list.push_back("mystring");//change the data
}
if i use this dll in my program
myclass mydll;
strvector mylist;
mydll.setvector(mylist);
if i use mylist again my program will crash;
how to deal with that?
i need to change the vector in my dll;
thanks thanks a lot.
|
|
|
|
|
You wrote:
typedef vector<string> strvector;
//just to make it clear to the others.
From what I have heard, it is not possible to pass stl data types like string , to dlls. You can use the good old character array etc.
this is this.
|
|
|
|
|
It is possible. Although, you'll have to do some export magic.
(I *think* Microsoft has already provided the magic needed for std::string)
|
|
|
|
|
how to solve this headache problem,thanks
|
|
|
|
|
The post below from Nemanja Trifunovic is very much the perfect solution.
For the debug version:
Go into the program options. In the C/C++ tab, in the Category: Code Generation , Use run-time library: Debug Multithreaded DLL
For the release version:
Use run-time library: Multithreaded DLL
I have tested it with Win32 dll, and MFC exe like you are using.
this is this.
|
|
|
|
|
how to do that in VS2003?there's no c run-time library.
thanks a lot.
|
|
|
|
|
It is located in:
Project->Project Properties->C/C++ -> Code Generation->Runtime Library.
this is this.
|
|
|
|
|
In general, that will work only if both the dll and the executable are linked dynamically against CRT and C++ standard library.
My programming blahblahblah blog. If you ever find anything useful here, please let me know to remove it.
|
|
|
|
|
Hmm.. why? I can see the potential problem of mixed up heaps, but that shouldn't happen, should it? Unless if stl objects messes with other objects' dynamically allocated memory.
|
|
|
|
|
In the original posters example, that is happening. The strvector is constructed in the exe. When the setvector method is called, a string that's been constructed in the DLL is added to the vector. Later, when the strvector is destructed in the executable, it'll call the string destructor, also in the executable. This will try to release memory from the DLLs heap, which it doesn't have access to unless you've used the DLL CRT.
|
|
|
|
|
Don't ask what was in my pipe.
|
|
|
|
|
hi all,
As i develop windows application in MFC and i am new to ATL/COM ,
for that which link or book are better to learn ATL/COM developement
send reply
|
|
|
|
|
|
I made a COM object in a DLL (VS 6.0, ATL wizard). And trying to fire event and handle it in browser (IE 6.0), but browser doesn't react.
What haven't I noticed?
========================================================
html page:
========================================================
<html><head>
<object name="loApp"
classid="clsid:B92CBD2B-E660-4164-8810-2F382237EFC9"
codebase="SimpleAtlCom.dll"
style="display:none"></object>
<script language="JScript">
function loApp::TotalMarks(TotalMarks){
alert(TotalMarks);
}
function mess(){
loApp.mess();
}
</script></head><body><form name="testForm">
<input type="button" value="mess()" onclick="mess()">
</form></body></html>
========================================================
Generated ConnectionPoint
========================================================
template <class T>
class CProxy_ISimpleObjEvents : public IConnectionPointImpl<T, &DIID__ISimpleObjEvents, CComDynamicUnkArray>
{
//Warning this class may be recreated by the wizard.
public:
VOID Fire_TotalMarks(SHORT TotalMarks)
{
T* pT = static_cast<T*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[1];
int nConnections = m_vec.GetSize();
MessageBox(NULL,(nConnections==0)?"==0":"!=0", NULL, MB_OK);
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
pT->Lock();
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
pT->Unlock();
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
if (pDispatch != NULL)
{
pvars[0] = TotalMarks;
DISPPARAMS disp = { pvars, NULL, 1, 0 };
pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL);
}
}
delete[] pvars;
}
};
|
|
|
|
|
Ilya R wrote: function mess(){
loApp.mess();
}
I think that is the problem. It seems that you do not have a function in the ActiveX that is called "mess ". Calling the right function in the ActiveX should do it.
this is this.
|
|
|
|
|
1)mess() is called:
// SimpleObj.cpp : Implementation of CSimpleObj
STDMETHODIMP CSimpleObj::mess()
{
MessageBox(NULL,"CSimpleObj::mess()", NULL, MB_OK);
Fire_TotalMarks(5);
return S_OK;
}
2)m_vec.GetSize()==0!!!!!
VOID Fire_TotalMarks(SHORT TotalMarks)
{
T* pT = static_cast<T*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[1];
int nConnections = m_vec.GetSize();
MessageBox(NULL,(nConnections==0)?"==0":"!=0", NULL, MB_OK);
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
pT->Lock();
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
pT->Unlock();
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
if (pDispatch != NULL)
{
pvars[0] = TotalMarks;
DISPPARAMS disp = { pvars, NULL, 1, 0 };
pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, NULL, NULL, NULL);
}
}
delete[] pvars;
}
|
|
|
|
|
I think you are using a simple object in your ActiveX. Right now I don't know any way to solve the problem with the simple object (nConnections = 0), but if you can implement a Full Control , that should solve the problem immediately.
I will look into some way to receive events using the simple atl object in the webbrowser.
this is this.
|
|
|
|
|
You are comletely right!!! Full Control does work!!
But, of course, it's not so cute to supply GUI interface in a object while it's used only for calculation.
I also try to migrate my code to C++Builder6.0 (it has similiar wizard and create ATL source) and the (nConnections = 0) problem appeared.
I tried to use the same version of Delphi wizard (it generate Delphi code but using the same libs as Builder, i suppose) and Delphi works OK.
I found smth but can't still explain:
http://discuss.microsoft.com/SCRIPTS/WA-MSD.EXE?A2=ind9803c&L=atl&T=0&P=647
if you have ideas, please, share
Thanks a lot
|
|
|
|
|
/*add this*/#include <atlctl.h>
class ATL_NO_VTABLE CSun :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSun, &CLSID_Sun>,
public IConnectionPointContainerImpl<CSun>,
public IDispatchImpl<ISun, &IID_ISun, &LIBID_SKYLib>,
public CProxy_ISunEvents< CSun >,
/*add this*/public IProvideClassInfo2Impl<&CLSID_Sun, &DIID__ISunEvents, &LIBID_SKYLib>,
/*add this*/public IPropertyNotifySinkCP<CSun>
{
public:
CSun()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_SUN)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CSun)
COM_INTERFACE_ENTRY(ISun)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
/*add this*/COM_INTERFACE_ENTRY(IProvideClassInfo)
/*add this*/COM_INTERFACE_ENTRY(IProvideClassInfo2)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CSun)
/*add this*/CONNECTION_POINT_ENTRY(DIID__ISunEvents)
CONNECTION_POINT_ENTRY(IID_IPropertyNotifySink)
END_CONNECTION_POINT_MAP()
// ISun
public:
STDMETHOD(rise)();
};
|
|
|
|
|
Where should i look for information regarding collections using ATL.
Actually i want to implement a heirarichal object, similar to ADO.
Where each command object has recordset collection and each recordset has field collection.
Thanx in Advance
Z.A
|
|
|
|
|
|
If you want collections look at STL.
Steve
|
|
|
|
|
|