爲什麼發生此錯誤?引用計數增加,線程模型是單個公寓。 Coll-object和EmptyColl-function都位於一個dll中。 ATL項目的默認調用轉換是__stdcall。與此dll內的其他對象發生同樣的錯誤。當打開觀察窗口將COM對象傳遞給VB 6時VariantClear異常
與空物體清除VARIANT VariantClear時拋出異常:
異常在VB6.EXE在0x75C14974(的oleaut32.dll)拋出:0000005:
訪問衝突讀取位置0x00000008。
frmMain.frm(錯誤,見下面爲什麼):
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(沒有錯誤):
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;
}
「*同樣的錯誤與此DLL *內其他物體發生」 - 那麼顯然,你正在做的事情你的DLL裏面根本錯誤的。請提供[最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve),其中顯示了更多的DLL代碼。特別是,它是如何聲明和設置'CColl'類以及其他您遇到問題的類。 –