做这个测试主要是因为我想将一些特殊的数据库操作放在DLL中,好控制文件的分发。我打算通过把DataSet类对象传入DLL中来实现这一点。
DLL和调用程序不是存在于同一进程空间吗,为什么这里会出现内存访问错误呢?
请高手指教。谢谢!!

解决方案 »

  1.   

    谢谢net_z的提示。我做了一个DLL,里面有一个Form,Form上有一个Image,我想通过在Exe中把一个TIcon传入DLL中进行显示,代码如下:DLL中的Export过程:
    type
      pTIcon = ^TIcon;
    procedure foo1(pico : pTIcon);
    begin
      if not Assigned(DllForm1) then
        DllForm1 := TDllForm1.Create(Application);//  DllForm1.Image1.Picture.Icon.Assign(picon^);   // 这一句报错:Cannot assign a TIcon to a TIcon
      DllForm1.Image1.Canvas.Draw(0, 0, pico^);  // 这一句可以把ico中的图像正常显示到DLL中的Form上。
      DllForm1.ShowModal;
    end;Exe中的调用方式:
    .....
      foo1(@ico);
    .....还望高手释疑。谢谢!
      

  2.   

    我想问的就是如何把调用程序的VCL对象的一个拷贝传入DLL中使用,用指针不太方便。
    上面出错的那句我不太理解,为什么可以使用它来绘图,复制一下却不行呢?
      

  3.   

    你把icon指针的声明放在引用单元中,主程序和动态链接库共同uses试试,实在不行就用句柄.
      

  4.   

    to net_z:Icon指针的声明主程序和动态连接库都有。
    to jabmoon(刺月):做这个例子是为了实现以后把DataSet等VCL对象往DLL中传递。你想我能用流吗?
      

  5.   

    我想你可以把icon申明放到一个单独单元,写一个bpl包,编译以后,让你的dll和exe程序都build with runtime package用这个包,应该可以!试一下吧!
      

  6.   

    呵呵原来是这个问题呀如下代码
    function showdllform(AHandle:thandle;ACaption:TCaption;icon:ticon):longint;stdcall;
    var
      i:ticon;
    begin
      application.Handle:=Ahandle;
      form:=tform1.Create(application);
      i:=icon;<-----------------------------------这里只能用:=而不能用assign
      form.image1.Canvas.Draw(0, 0, i);
      result:=longint(form);
      form.Show;
    end;
      

  7.   

    如果把 DllForm1.Image1.Picture.Icon.Assign(pico^);  
    换成
    DllForm1.Image1.Picture.Icon:=pico^;
    也可以成功跟踪到assign里发现,好象是pico^丢失了他的类型信息大虾们帮忙分析一下吧
      

  8.   


    ◎使用package
    ◎use ShareMem unit.HTH
      

  9.   

    to qiubolecn(来自差生市):谢谢,你的方法很管用,但是为什么在DLL里不能用Assign呢?100分先给你计上。如有解释,另行加分。
    这个贴子我会再加100分,感谢各位的讨论。
      

  10.   

    Assign是把对象复制给另外一个对象,而对象直接赋值其实是指针赋值,如 A := B(都是对象)是把A指向B指向的内存空间
      

  11.   

    这个我知道啊!我不明白的是在主程序中可以使用Assign,为什么到DLL中就不行了呢?主程序和DLL应该是同一个进程地址空间呀。