Gegenstück der VCL zur COleSafeArray Klasse der MFC
lima-city → Forum → Programmiersprachen → C/C++ und D
aufrufen
beitrag
daten
funktion
hersteller
informatik
interface
klasse
methode
minute
null
variant arrays
vermutung
zusammen
-
Hallo zusammen,
ich habe folgendes Problem:
Eine Methode eines COM- Interface erwartet als Paramater ein VARAINT Array. Bisher habe ich dieser Methode ein Variant Array übergeben das mittels "VarArrayCreate" erzeugt und anschliessen mit Daten gefüllt wurde.
C/C++ Code:
int b[2] = {dwBufferSize,0};
Variant varBuffer = VarArrayCreate(b,1,varByte);
void* pBuffer = varBuffer.ArrayLock();
ReadFile(m_hFile, pBuffer, dwBufferSize, &dwReturn, NULL);
varBuffer.ArrayUnlock();
amv->RenderVideoSample(dwFlags, dw64StartTime, dw64StopTime, varBuffer);
C/C++ Code:
int b[2] = {dwBufferSize,0};
Variant varBuffer = VarArrayCreate(b,1,varByte);
void* pBuffer = varBuffer.ArrayLock();
ReadFile(m_hFile, pBuffer, dwBufferSize, &dwReturn, NULL);
varBuffer.ArrayUnlock();
amv->RenderVideoSample(dwFlags, dw64StartTime, dw64StopTime, varBuffer);
C/C++ Code:
int b[2] = {dwBufferSize,0};
Variant varBuffer = VarArrayCreate(b,1,varByte);
void* pBuffer = varBuffer.ArrayLock();
ReadFile(m_hFile, pBuffer, dwBufferSize, &dwReturn, NULL);
varBuffer.ArrayUnlock();
amv->RenderVideoSample(dwFlags, dw64StartTime, dw64StopTime, varBuffer);
Alles schön und gut, funktioniert auch, ABER ich habe ein riesiges Speicherleck von ca. 10MB/Minute.
Wenn ich die Methode nicht aufrufe, also so:
C/C++ Code:
int b[2] = {dwBufferSize,0};
Variant varBuffer = VarArrayCreate(b,1,varByte);
void* pBuffer = varBuffer.ArrayLock();
ReadFile(m_hFile, pBuffer, dwBufferSize, &dwReturn, NULL);
varBuffer.ArrayUnlock();
//amv->RenderVideoSample(dwFlags, dw64StartTime, dw64StopTime, varBuffer);
C/C++ Code:
int b[2] = {dwBufferSize,0};
Variant varBuffer = VarArrayCreate(b,1,varByte);
void* pBuffer = varBuffer.ArrayLock();
ReadFile(m_hFile, pBuffer, dwBufferSize, &dwReturn, NULL);
varBuffer.ArrayUnlock();
//amv->RenderVideoSample(dwFlags, dw64StartTime, dw64StopTime, varBuffer);
C/C++ Code:
int b[2] = {dwBufferSize,0};
Variant varBuffer = VarArrayCreate(b,1,varByte);
void* pBuffer = varBuffer.ArrayLock();
ReadFile(m_hFile, pBuffer, dwBufferSize, &dwReturn, NULL);
varBuffer.ArrayUnlock();
//amv->RenderVideoSample(dwFlags, dw64StartTime, dw64StopTime, varBuffer);
ist alles i.O. (kein Speicheleck aber auch keine Funktion). Meine Vermutung ist das es wohl an der COM- Komponete liegt, also habe ich den Hersteller kontaktiert. Der sagt bei ihm gibt es keine Probleme und verwiess nur auf seine Codebeispiele die aber mit VC entwickelt wurden. Er meinte auch das es an der Art der Übergabe des Variant Arrays liegen könnte. In den Beispielen verwenden sie die Klasse COleSafeArray. Hier der Code:
C/C++ Code:
// Setup our MFC helper class and read frame data from file
COleSafeArray SafeArray;
VARIANT varBuffer;
SafeArray.ResizeOneDim(dwBufferSize);
SafeArray.AccessData((void**) &pBuffer);
ReadFile(m_hFile, pBuffer, dwBufferSize, &dwReturn, NULL);
SafeArray.UnaccessData();
// Render video and audio samples retrieved from input file
varBuffer = SafeArray.Detach();
amv->RenderVideoSample(dwFlags, dw64StartTime, dw64StopTime, varBuffer);
SafeArray.Attach(varBuffer);
C/C++ Code:
// Setup our MFC helper class and read frame data from file
COleSafeArray SafeArray;
VARIANT varBuffer;
SafeArray.ResizeOneDim(dwBufferSize);
SafeArray.AccessData((void**) &pBuffer);
ReadFile(m_hFile, pBuffer, dwBufferSize, &dwReturn, NULL);
SafeArray.UnaccessData();
// Render video and audio samples retrieved from input file
varBuffer = SafeArray.Detach();
amv->RenderVideoSample(dwFlags, dw64StartTime, dw64StopTime, varBuffer);
SafeArray.Attach(varBuffer);
C/C++ Code:
// Setup our MFC helper class and read frame data from file
COleSafeArray SafeArray;
VARIANT varBuffer;
SafeArray.ResizeOneDim(dwBufferSize);
SafeArray.AccessData((void**) &pBuffer);
ReadFile(m_hFile, pBuffer, dwBufferSize, &dwReturn, NULL);
SafeArray.UnaccessData();
// Render video and audio samples retrieved from input file
varBuffer = SafeArray.Detach();
amv->RenderVideoSample(dwFlags, dw64StartTime, dw64StopTime, varBuffer);
SafeArray.Attach(varBuffer);
Nun mal blöd gefragt, was mein ihr dazu? Und gibt es ein Gegestück in der VCL zur COleSafeArray Klasse der MFC?
Danke im voraus
Beitrag geändert: 11.10.2007 11:13:44 von informatik-virus
Beitrag geändert: 11.10.2007 11:14:05 von informatik-virus -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage