dllMDI窗体有没有办法调用父窗体的方法
dllMDI窗体有没有办法调用父窗体的方法
我想把所有子窗体都创建在DLL中,父窗体只向DLL传如APPLICATION对象
有没有办法在MDI子窗体内调用父窗体的自定义方法,通过父窗体的句柄对象能反射调用吗?
typedef int(*func)(int);
func sum;
sum = (func)Application->MainForm->MethodAddress("GetSum");
return sum(10);
这是我在BCB代码里写的代码,到行不通,sum 等于 NULL,
在设置子窗体的Parent = Application->MainForm运行时发生错误Cannot focus a disabled or invisible window
所有改用Application->MainForm
我还尝试了另外一种方法,但也不行
PMethodInfoHeader mih
mih = GetMethodInfo(Application->MainForm,"GetSum");
int p1 = 1,p2 =2;
Variant *v1;
int result = ObjectInvoke(Application->MainForm,mih, &p1,p2,v1,1);
return result;
[解决办法]
1.typedef int(*func)(int);//改为:typedef int(__closure *func)(int);
2.MainForm的"GetSum" 为 __publish 方法。
3.DLL加载时,传递主程序的Application到DLL中并替换,DLL卸载时,还原Application指针。
4.注意运行时刻,DLL Parent = Application->MainForm时,MainForm已经显示完成。
我没测试,不知行不行,你试试吧
[解决办法]
可以在子窗体给主窗体发送消息。
主窗体根据消息执行相应的函数。
前提是子窗体创建的时候,把主窗体的Handle传给子窗体。
[解决办法]
主窗体的方法必须定义在published下的才可以获取到。你这个函数如果是public下就根本获取不到。
看看官方解释
TObject::MethodAddress
Returns the address of a published method.
If Name does not specify a published method for the object, MethodAddress returns NULL.