Pourquoi cette erreur s'est produite? Le nombre de références est augmenté, les modèles de threads sont des appartements individuels. Coll-object et EmptyColl-function tous deux situés à l'intérieur d'une DLL. La conversion d'appel par défaut du projet ATL est __stdcall. La même erreur s'est produite avec d'autres objets dans cette DLL.Exception VariantClear lors de la transmission de l'objet COM à VB 6 avec la fenêtre de surveillance ouverte
VariantClear lève une exception lorsque la compensation VARIANT avec NULL objet:
Exception lancée à 0x75C14974 (oleaut32.dll) dans VB6.EXE: 0xC0000005:
emplacement lecture violation d'accès 0x00000008.
frmMain.frm (erreur, voir ci-dessous pourquoi):
Private Sub Form_Load()
Dim c As Coll
Set c = EmptyColl
'error when ends here with variable "c" in the watch window.
End Sub
frmMain.frm (pas d'erreur):
Private Sub Form_Load()
Dim c2 As Coll 'instead of Coll can be any object of same library
Set c2 = New Coll 'creation
Set c2 = Nothing 'destroying (optionaly)
Dim c As Coll
Set c = EmptyColl
'no error
End Sub
filyus.idl:
[
object,
uuid(6FA7FAEB-5CE3-4A80-9288-2667EE5E7596),
dual,
nonextensible,
pointer_default(unique)
]
interface IColl : IDispatch{
//some methods
};
[
uuid(157F3D2F-A427-4D5A-B908-87868297EA43),
version(1.0),
]
library Filyus
{
importlib("stdole2.tlb");
[
dllname("Filyus")
]
module Filyus{
[entry("EmptyColl")]
HRESULT EmptyColl([out, retval] IColl** Coll);
}
};
filyus.def:
LIBRARY
EXPORTS
DllCanUnloadNow PRIVATE
DllGetClassObject PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
DllInstall PRIVATE
EmptyColl
ole.h:
extern HRESULT EmptyColl(IColl** Coll);
ole.cpp:
HRESULT EmptyColl(IColl** Coll) {
HRESULT hr; CComObject<CColl>* Object;
if (Coll != nullptr) {
hr = CComObject<CColl>::CreateInstance(&Object);
if (hr == S_OK) {
Object->AddRef();
*Coll = Object; //same error with using QueryInterface
}
}
else hr = E_POINTER;
return hr;
}
« * même erreur vient de se produire d'autres objets à l'intérieur de cette dll * » - il est clair que vous faites quelque chose de fondamentalement mauvais dans votre DLL. Veuillez fournir un [exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) montrant plus de code de votre DLL. En particulier, comment il déclare et configure la classe 'CColl', et d'autres classes avec lesquelles vous rencontrez des problèmes. –