Hej DrTungforts: Angelägen fråga om att skapa en ATL-Metod
Som du misstänkte så fungerar anropet till ChkCustomerData om man anropar det
inifrån tråden så nu har jag ägnat dagen till att få denna marshalling att fungera.
Dock utan att lyckas.
Threadproceduren ser nu ut som följer:
DWORD WINAPI ThreadProcCustomerDataDs(void* tparam)
{
HRESULT hr;
int tmp;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
_CustomerDataDsPtr ptr;
ptr.CreateInstance(__uuidof(CustomerDataDs));
ptr.AddRef();
hr = CoMarshalInterThreadInterfaceInStream(IID_IUnknown, ptr, &pStream);
// Har provat IID_IDispatch också med samma resultat. Om jag använder
// __uuidof(ICustomerDataDs) får hr en felkod om att Interfacet ej går
// att konvertera.
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
CoUninitialize();
return 0;
}
Konstruktorn till CCustomerDataDs ser ut så här:
CCustomerDataDs()
{
short i = 0;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
pStream = NULL;
hThread = CreateThread(NULL, 0, ThreadProcCustomerDataDs, (LPVOID) pStream,
0, &threadID);
while ((pStream == NULL) && (i < 10))
{
Sleep(1000);
i++;
}
HRESULT hr;
_CustomerDataDsPtr tmp;
hr = CoGetInterfaceAndReleaseStream(pStream, IID_IUnknown, (void**) &tmp);
short tmp2;
tmp2 = tmp->ChkCustomerData (NULL);
MessageLong("ChkCustomerData ", (long) tmp2);
}
Som global variabel finns:
IStream* pStream;
Vid anropet tmp->ChkCustomerData(NULL) blir det ett fel
med meddelandet:
The value of ESP was not properly saved across a function call.....
Det känns som om jag är nära nu men än syns inget direkt ljus i tunneln.
/Peter