Jag har frågat om detta under rubriken c++ tidigare men det är kanske ett vb-problem så jag ställer frågan här också: A quick question, when you start the new thread that you wrapper should run on , does any of the ( New ) methods you need to use have any parameters? I know you can't pass any parameters when initiating a new object via a separate new thread,. might be your problem is that somewhere down the line of your thread you initiate an object use the vb New key word and need to pass in some params...system.Threading does not allow that, just a thought. if it is so try to create the objects reuired and pass the parameters into the new objects as properties instead... Den New som gör att allt kraschar är lokal inne i VB-metoden.Minnesproblem med komponent.
Jag håller på med att skriva en COM-komponent i C++ med hjälp av Visual Studio .NET 2003 och ATL.
Denna komponent innehåller tre olika klasser som är wrappers till motsvarande klasser
som finns i en VB-komponent.
VB-objektet skall skapas i en tråd som startas när C++-objektet skapas.
C++-klassen har sedan samma metoder och properties som VB-klassen som den bara skickar vidare.
Detta fungerar om det är enkel kod i VB-klassen men om någon metod i VB-klassen gör New på någon privat klass så kraschar det hela sedan hos klientprogrammet på grund av att minnet ej går att läsa. KLientprogrammet är skrivet i VB. Felet är att
minnet inte går att läsa.
Om jag struntar i tråden och skapar VB-objeket i C++-klassens konstruktor så funkar det hela bra.
Hoppas någon har en ide för det är viktigt att detta går att lösa.
mvh
Peter ESv: Minnesproblem med komponent.
cheers PaulSv: Minnesproblem med komponent.
Här är dels koden som skapar tråden på C++-sidan:
CCustomerDataDs()
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
hThread = CreateThread(NULL, 0, ThreadProcCustomerDataDs, (LPVOID) &ptr3,
0, &threadID);
}
DWORD WINAPI ThreadProcCustomerDataDs(void* tparam)
{
_CustomerDataDsPtr *ptr;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
ptr = (_CustomerDataDsPtr *) tparam;
ptr->CreateInstance(__uuidof(CustomerDataDs));
ptr->AddRef();
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
CoUninitialize();
return 0;
}
samt en av metoderna som anropar en VB-metod:
STDMETHODIMP CCustomerDataDs::ChkCustomerData(BSTR* MMCard, SHORT* retChkCustomerData)
{
short rc = -1;
if (ptr3 != NULL)
rc = ptr3->ChkCustomerData(MMCard);
*retChkCustomerData = rc;
return S_OK;
}
Samt VB-metoden:
Public Function ChkCustomerData(MMCard As String) As Integer
Dim cLog As clsLog
On Error GoTo ErrorHandler
'Här kraschar det
Set cLog = New clsLog
cLog.FileName = "c:\test\logfile.txt"
cLog.Log Now & " ChkCustomerData 1"
ChkCustomerData = 30
Set cLog = Nothing
Exit Function
ErrorHandler:
ChkCustomerData = 300
End Function