http://61.133.87.165/bbs/attachment.php?s=&postid=382458
我通过这个程序,运行如下代码可以正常执行
Sub Test()
Dim obj
Set obj = CreateObject("COfficeDialog.AxCommFile")
If Not obj Is Nothing Then
obj.DoModal()
Set obj = Nothing
End If
End Sub
Test
---------------------
其中COfficeDialog是我写的OLE自动化,可是我却无法让他去调用OCX控件。
那位肯帮忙解决?我想让我程序具有VBA功能,提供个思路也行啊!!
我的想法是把OCX控件放在对话框里,然后VB脚本通过他的方法去执行。问题是如何得到OCX的接口,以及怎么样去管理,调配。
up起来。
解决不了,帮你up
只能帮你UP了
可是我却无法让他去调用OCX控件???
-----------------------------
COfficeDialog.AxCommFile就是一个ocx控件呀!
你自己不是调用成功了吗?
up
能不能用com呢?关注
接分
up
注册
up
只是来接分的!
由COfficeDlg提供方法来查讯OCX控件的IDispatch接口,或者自定义一接口,然后用自定一接口获取标准自动化接口
如实现义方法QueryInterface( DWORD idOCX, REFIID IID, void** IDispatch )
IDispatch可以用来访问OCX的所有方法和属性
up
up
up
you only have to pass IDispatch* to the script function.
void CScriptDemoDlg::OnTestOwnctrl()
{//http://61.133.87.165/bbs/attachment.php?s=&postid=382458
//http://www.codeproject.com/com/ScriptDemo.asp
// TODO: Add your control notification handler code here
LPUNKNOWN lpknow=m_mytestctrl.GetControlUnknown();
if(!lpknow)
return;
LPDISPATCH lpDisp=NULL;
HRESULT hr=lpknow->QueryInterface(IID_IDispatch,(void**)(&lpDisp));
if(FAILED(hr)||NULL==lpDisp)
return;
CString strProc;
CString strCode = "function TestMyCtrl(obj) \n {\n obj.test(\"called by my test script in 319\");\n }\n";
m_ctlFunctions.GetWindowText( strProc );
strProc = "TestMyCtrl";
if (!m_ScriptObj.AddScript( strCode ))
{
CString strError = m_ScriptObj.GetErrorString();
m_ctlResult.SetWindowText( strError );
}
else
m_ctlResult.SetWindowText( _T("") );
/*
function TestMyCtrl(obj)
{
obj.test("a");
}
Function TestMyCtrl(obj)
obj.test("aafdsadfdsgdasgsdf")
End Function
*/
CSafeArrayHelper sfHelper;
try{
_variant_t var;
sfHelper.Create(VT_VARIANT, 1, 0, 1); // 1 parameter
var = lpDisp;
sfHelper.PutElement(0, (void*)&var); // parameter1 -> index 0
LPSAFEARRAY sa = sfHelper.GetArray();
_variant_t varRet;
if (m_ScriptObj.RunProcedure(strProc, &sa, &varRet))
m_ctlResult.SetWindowText( (LPCTSTR)(_bstr_t(varRet)) );
else
{
CString strError = m_ScriptObj.GetErrorString();
m_ctlResult.SetWindowText( strError );
}
}
catch(...)
{
CString strError = m_ScriptObj.GetErrorString();
m_ctlResult.SetWindowText( strError );
}
}