CAEngine::SetCallbackObject
ADE User Guide > ADE Server Class Reference > CAEngine
该特征目前正处于试验阶段。
CAEngine::SetCallbackObject(IUnknown* pCallbackObj)
在ADE计算一个模型或者typescript时,当模型在计算机Analytica中被计算时,将遇到各种要求用户交互的函数。例如,如果一个表达式包含一个MsgBox函数,Analytica将在一个信息框内显示一个问题,要求获取用户的回答。因为ADE不包含用户接口,将不会直接处理这些用户交互。 CAEngine::SetCallbackObject给用户提供了一种方法在遇到这种事件发生时接收回调,这样你的程序可以采取预期的动作,例如给用户显示一个信息框。
ADE给各种事件(函数或指令)定义各种回调接口,可能触发用户接口交互。目前,存在下面的接口:
:注意:此计划是:一旦这通过实验阶段,将添加其它回调接口,对于一些事件,例如ShowProgressBar、AskMsgNumber、AskMsgText、显示警告、Show指令(显示结果、显示定义、显示图形)等等。
用法
要使用回调,你必须执行一个由你想处理和执行其方法的接口所驱动的COM类型。作为一个COM类型,你必须执行标准的IUnknown::QueryInterface COM 方法,这必须报告它支持所有这些接口。然后你再实例化那个类型的例子并将它传给此方法。
在C++ 中
#使用ADE和 (不间断空格)输入"ADE.exe";
class MyCallback : public IAMsgBoxCallback {
public:
STDMETHODIMP QueryInterface(REFIID riid, LPVOID* ppv)
{
if (riid==IID_IUnknown) {
*ppv = (LPVOID)dynamic_cast<IUnknown*>(this);
} else if (riid == __uuidof(IAMsgBoxCallback)) {
*ppv = (LPVOID)dynamic_cast<IAMsgBoxCallback*>(this);
} else {
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
STDMETHOD(ShowMsgBox)(BSTR title, BSTR text, LONG buttons, LONG* /*out*/ whatPressed)
{
*whatPressed = MessageBox(NULL,text,title,buttons);
return S_OK;
}
};
void main()
{
CoInitialize(NULL);
CAEnginePtr pAde(__uuidof(_CAEngine));
pAde->SetCallbackObject(new MyCallback);
...
CoUninitilize();
}
在C#中
目前我们还不能在.NET中这样做——这是为什么这现在还是一个考虑中的实验特征的原因,我们认为C#执行应该类似于这里我们所看到的,因为我们目前还没有让它能能够成功运行,明显我们离这还有相当一段距离。我们的两个理论就是:该类型上的某些额外的.NET属性的装饰仍然是需要的,或者某些额外的注册表设置需要配置。我们在此提供了这方法用来帮助实验。
using ADE;
namespace MyApp
{
[Guid("2576608A-833D-4742-BF63-794869E642C3")] // 使用DevStudio中的Create GUID工具建立你自己的 [ClassInterface(ClassInterfaceType.None)]
public class MyCallback : IAdeMsgBoxCallback
{
public int ShowMsgBox(string title, string text, int buttons)
{
MessageBoxButtons btns = (MessageBoxButtons)buttons;
DialogResult res = MessageBox.Show(text, title, btns);
return (int)res;
}
}
class Program
{
static void Main(string[] args)
{
CAEngine ade = new CAEngine();
ade.SetCallbackObject(new MyCallback());
...
}
}
}
Comments
Enable comment auto-refresher