我試圖從一個線程調用一個指針。 這裏是我的代碼:從C++線程調用指針
將myDll.dll C++:
long cbAddrAsync;
void _asyncer(void* data)
{
typedef void (__stdcall *FUNCPTR)();
FUNCPTR vbFunc;
vbFunc = (FUNCPTR)cbAddrAsync;
vbFunc();
}
extern "C" __declspec(dllexport) void async(long addr)
{
cbAddrAsync = addr;
HANDLE hHandle = (HANDLE)_beginthread(_asyncer,0,NULL);
}
調用這個EXTERN使用VB6: 在模塊1:
Declare Sub async Lib "myDll.dll" (ByVal addr As Long)
Sub onAsync()
MsgBox "ASYNC"
End Sub
在Form1:
Private Sub Command_Click()
Call async(AddressOf Module1.onAsync)
End Sub
當我點擊命令按鈕,將出現問題的
dll:
Unhandled exception at 0x734f9232 in Project1.exe: 0xC0000005: Access violation reading location 0x00000076.
in vbFunc();
我怎樣才能解決呢? 謝謝。
要在問題中正確格式化代碼,只需用至少4個空格縮進代碼行即可。 – 2014-09-20 09:25:29
您需要遠遠超過_beginthread創建一個線程來運行VB代碼。它需要一些稱爲線程本地存儲的東西需要設置,而且你不能訪問任何UI和最常見/共享的數據。即使API調用也需要TLS,除非它們在類型庫中進行了decalred。查看http://hashvb.earlsoft.co.uk/Multi_threading – Deanna 2014-09-23 11:19:23
最簡單的方法是'_asyncer'創建一個公共的VB6創建類的實例。您需要在新線程上使用'CoInitialize'和'CoCreateInstance'傳遞VB6類CLSID。這將初始化VB6運行時(包括TLS等),以便您可以調用您的'AddressOf'回調並在其中使用所有VB6內置函數。 – wqw 2014-09-23 21:32:14