描述:
比如说我在dcom中要实现这样的函数:(这里简单写)
f(f1,int a,int b)
{f1(a,b);}
而f1是我们传递过去的参数,它是客户端定义的函数,
实现两个数的相加:
如f1(int a,int b){c=a+b;}
各位大哥大姐,
可否帮我看看!不胜感激!
解决方案1:
实际上函数fl是个户提供的一个函数指针,它只在客户进程有效,服务器的回调应在客户进程执行,用wangweixing2000(星)的方法就可以了,但是wangweixing2000(星)不是动态的函数指针调用,你可以在他的基础上加一个参数,但不要用函数指针,用一个DWORD或long,调用时把函数指针强制转换一下。
简单写一下:
idl:
[...]interface ICallBack : IUnKnown {
HRESULT fClntCB([in]DWORD fcb, [in]int a, [in]int b);
};
server:
HRESULT f(IUnknown* pUnk, DWORD fcb, int a, int b) {
if (pUnk) return E_POINTER;
ICallBack* pCB = NULL;
pUnk->QueryInterface(IID_ICallBack, (void**)&pCB);
if (pCB) return E_NOINTERFACE;
pCB->fClntCB(fcb, a, b);
...
pCB->Release();
return S_OK;
}
client:
long (fl)(int a, int b);
HRESULT fClntCB(DWORD fcb, int a, int b) {
fl* ftmp = reinterpret_cast<fl*>fcb;
long rt = ftmp(a, b);
...
}
long f1(int a, int b) {return a+b};
long f2(int a, int b) {return a*b};
fClntCB(pIXxx, (DWORD)(&f1), 123, 456);
fClntCB(pIXxx, (DWORD)(&f2), 123, 456);
连接点可以实现:
eg:
com中一个事件:LONG f([in]long x,[in]long y);
在你想要激发的地方: long s = fire_f(x,y);
在客户:
接受事件:
LONG APP::f(long x,long y)
{
return f1(x,y);//f1为你客户端一个函数
}
很简单,因为你只是想要结果而不管内部怎么计算,哈哈