如题:在调用DLL中的MDI子窗体中按回车和方向键无效?当焦点在按钮上的时候,按回车没反映,按方向建也不移动焦点。DLL项目代码如下:var
  DllApplication: TApplication;
  DllScreen: TScreen;procedure DLLUnloadProc(Reason: Integer); register;
begin
  if Reason = DLL_PROCESS_DETACH then
  begin
    Application := DllApplication;
    Screen := DllScreen;
  end;
end;procedure DLLEntry(Reason: DWORD);
begin
  case Reason of
    DLL_PROCESS_ATTACH:
      CoInitialize(nil);
    DLL_PROCESS_DETACH:
      CoUninitialize();
  end;
end;exports
  OpenCoaLeft;begin
  DLLProc := @DLLEntry;
  DLLEntry(DLL_PROCESS_ATTACH);
  DllApplication := Application;
  DllScreen := Screen;
  DLLProc := @DLLUnloadProc;
end.从DLL导出的的函数如下:……
varMyParentForm: TForm;
MyParentApplication: TApplication;……procedure OpenCoaLeft(ParentApplication: TApplication;
  H: THandle;
  ParentForm: TForm;
  AConn: TSMBLogin); stdcall;
begin
  Application.Handle := H;
  Application := ParentApplication;
  OpenForm(TFormCOALeft, FormCOALeft, ParentForm);
  FormCOALeft.SMBLogin1 := AConn;
  FormCOALeft.MyParentForm := ParentForm;
  FormCOALeft.MyParentApplication := ParentApplication;
end;
找了一些资料看了,不过都没有解决,请大家帮忙,谢谢!

解决方案 »

  1.   

    高手哪去了?帮帮忙。
    我网上找了一个例子,好像可以的,不过创建多个MDI子窗口就会出现什么类已经存在的异常错误,然后就不能执行下去了。
      

  2.   

    如果是按钮触发的话,你可以在按钮事件中增加,判断是不是ENTER等
      

  3.   

    DLL_PROCESS_ATTACH:
          CoInitialize(nil);
        DLL_PROCESS_DETACH:
          CoUninitialize();
      end;你使用了COM吗?如果没有用去掉这个.
      

  4.   

    至今未解决!!!google了一个例子,可以的,不过老是出错,又看不出例子程序与我自己写的有什么差别,很郁闷
      

  5.   

    用dll封装vcl窗体会遇见一些奇怪的问题,如无法移动焦点,关闭子窗口和退出主程序时报内存访问错误等,这种问题工作在mdi时特别突出,问题出在delphi的dll机制上,dll和主控程序中都有一个application和screen对象,虽然使用替换法(将主控程序中的application和screen传入dll)可解决部分问题,但本质是无法根除的。
    cantu(《delphi从入门到精通》作者)建议用bpl代替dll。我在一些项目中就是这样做的,配合优胜rtti或接口技术,这确实是一个好办法。
      

  6.   

    谢谢楼上的~
    有没有例子,能不能发一个给我看看,不胜感激![email protected]
      

  7.   

    FormCOALeft.MyParentForm := ParentForm;
    这是干什么?
      

  8.   

    不需要搞得要初始化DCOM这么复杂吧.有什么特殊要求要这样吗.
      

  9.   

    打开 project->options 选中Packages,然后把 Build with runtime packages钩上
      

  10.   

    打开 project->options 选中Packages,然后把 Build with runtime packages钩上--------------------------------------需要把哪些bpl呢?默认的有好多。