ActiveX多线程调用javascript回调例程出现问题
Trouble in ActiveX multi-thread invoke javascript callback routine
每个人。我在使用ATL进行ActiveX编程时遇到了一些麻烦。我尝试制作一个activex,它可以将文件从http服务器异步下载到本地文件夹,下载后会调用javascript回调函数。我的解决方案是:运行一个线程M来监控下载线程D,当D完成任务时,M将自己终端并调用IDispatch推断调用javascript函数。*****************有我的代码:*****.******
/* javascript code */
funciton download() {
var xfm = new ActiveXObject("XFileMngr.FileManager.1");
xfm.download(
'http://somedomain/somefile','localdev:''folder'localfile',function(msg){alert(msg);});
}
/* C++ code */
// main routine
STDMETHODIMP CFileManager::download(BSTR url, BSTR local, VARIANT scriptCallback)
{
CString csURL(url);
CString csLocal(local);
CAsyncDownload download;
download.Download(this, csURL, csLocal, scriptCallback);
return S_OK;
}
// parts of CAsyncDownload.h
typedef struct tagThreadData {
CAsyncDownload* pThis;
} THREAD_DATA, *LPTHREAD_DATA;
class CAsyncDownload :
public IBindStatusCallback
{
private:
LPUNKNOWN pcaller;
CString csRemoteFile;
CString csLocalFile;
CComPtr<IDispatch> spCallback;
public:
void onDone(HRESULT hr);
HRESULT Download(LPUNKNOWN caller, CString& csRemote, CString& csLocal, VARIANT callback);
static DWORD __stdcall ThreadProc(void* param);
};
// parts of CAsyncDownload.cpp
void CAsyncDownload::onDone(HRESULT hr) {
if(spCallback) {
TRACE(TEXT("invoke callback function'n"));
CComVariant vParams[1];
vParams[0] = "callback is working!";
DISPPARAMS params = { vParams, NULL, 1, 0 };
HRESULT hr = spCallback->Invoke(0,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
¶ms, NULL, NULL, NULL);
if(FAILED(hr)) {
CString csBuffer;
csBuffer.Format(TEXT("invoke failed, result value: %d 'n"),hr);
TRACE(csBuffer);
}else {
TRACE(TEXT("invoke was successful'n"));
}
}
}
HRESULT CAsyncDownload::Download(LPUNKNOWN caller, CString& csRemote, CString& csLocal, VARIANT callback) {
CoInitializeEx(NULL, COINIT_MULTITHREADED);
csRemoteFile = csRemote;
csLocalFile = csLocal;
pcaller = caller;
switch(callback.vt){
case VT_DISPATCH:
case VT_VARIANT:{
spCallback = callback.pdispVal;
}
break;
default:{
spCallback = NULL;
}
}
LPTHREAD_DATA pData = new THREAD_DATA;
pData->pThis = this;
// create monitor thread M
HANDLE hThread = CreateThread(NULL, 0, ThreadProc, (void*)(pData), 0, NULL);
if(!hThread) {
delete pData;
return HRESULT_FROM_WIN32(GetLastError());
}
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);
CoUninitialize();
return S_OK;
}
DWORD __stdcall CAsyncDownload::ThreadProc(void* param) {
LPTHREAD_DATA pData = (LPTHREAD_DATA)param;
// here, we will create http download thread D
// when download job is finish, call onDone method;
pData->pThis->onDone(S_OK);
delete pData;
return 0;
}
**************代码结束**********好的,以上是我的部分源代码,如果我在子线程中调用onDone方法,我将得到OLE错误(-2147418113(8000FFFF(灾难性故障。(。我错过什么了吗?请帮我弄清楚。
相关文章:
- 多个JavaScript子例程的实时DOM显示
- 支持 JavaScript 的检查例程适用于 Chrome/Opera/IE,但不适用于 Firefox/Safari
- 更合乎逻辑的设置超时例程
- 当访问文件时,我可以自动调用例程或函数吗
- 访问Chrome'的内部gzip例程
- Django:如何将模板变量传递给JavaScript OnClick例程
- 使用“;调解员”;作为侦听块例程中的汇点
- 看不到如何将洪水填充例程更改为 DFS 例程
- 使用异步子例程对一组函数进行计时
- 使用 attributes.add 在客户端更改文本框时调用例程
- 一个按钮上的多操作与javascript例程
- Facebook 信用回调例程未调用
- 我将如何使用闭包在 C# 中重写此 JavaScript 例程
- 如何将动画例程转换为通用的、可重用的 jQuery 函数
- 鼠标左键单击与 JavaScript 中的右键单击例程冲突
- Javascript 模态窗口例程每次单击都会执行更多时间
- 使用 Node.JS 设计机器人,这些机器人以随机超时和通用例程运行
- 如何将烦人的“for”循环转换为“Object.keys”例程或类似例程(JSLint)
- 有时不会发送电子邮件(如果必须运行第一个子例程,则会跳过第二个子例程)
- ActiveX多线程调用javascript回调例程出现问题