rt

解决方案 »

  1.   

    lijinghe1(副乡长)
    但是我的调用有问题啊,和DLL一样调用吗?
      

  2.   

    program TestExe; //输出函数的Exeuses
      Windows;procedure Test(p: PChar); export; stdcall;
    begin
      MessageBox(0, p, 'Test', MB_OK);
    end;exports
      Test;begin
    end.procedure TForm1.Button1Click(Sender: TObject); //另一APP中调用
    var
      lib: THandle;
      Test: procedure(p: PChar); stdcall;
    begin
      lib := LoadLibrary('TestExe.exe');
      if lib = 0 then
        ShowError('Cannot load the module')
      else
      begin
        @Test := GetProcAddress(lib, 'Test');
        if @Test = nil then
          ShowError('Cannot GetProcAddress')
        else Test('This is a test');
        FreeLibrary(lib);
      end;
    end;
      

  3.   

    我有一个exe中的函数
    function XMLToPopupMenu(mPXMLNode: IXMLNode; mPopupMenu: TPopupMenu): Boolean;
    mPXMLNode是一个xml中的一个节点
    mPopupMenu是快捷菜单
    函数功能是遍历给定节点的xml生成快捷菜单
    调用时候有access violation的错误
      

  4.   

    madyak(无天) 
    这种简单的调用我也试过好用,不过我的那个有问题:(
    请帮忙谢谢
      

  5.   

    madyak(无天) 
    您这个方法里面也有access violation的错误
      

  6.   

    madyak(无天) 
    您给我的那篇代码你试过好用了?
      

  7.   

    我试了 madyak(无天) 的代码,确实不行。。
    我也来想想办法。。
      

  8.   

    tonylk(=www.tonixsoft.com=) 
    谢谢你,我在线等,他的那个代码如果编译成dll就可以用了
    http://expert.csdn.net/Expert/topic/3044/3044699.xml?temp=.5382654
      

  9.   


    program TestExe; //输出函数的Exeuses
      Windows;
    {$IMAGEBASE $40000000}             //加上这个就OK了
    procedure Test(p: PChar); export; stdcall;
    begin
      MessageBox(0, p, 'Test', MB_OK);
    end;
    //用调入的LIBRARY的基址不能和宿主EXE文件基址发生冲突。
      

  10.   

    lijinghe1(副乡长)
    感谢您的回答,为什么上面的那段代码加了{$IMAGEBASE $40000000}可以,我的代码加了还是有问题这个时候av错误at address 00000000
    解决马上揭帖,谢谢
      

  11.   

    是不是其他错误啊,方便贴代码否?或者到[email protected]
      

  12.   

    我照 lijinghe1(副乡长) 的做了之后还是不行嘛?
      

  13.   

    TO: tonylk(=www.tonixsoft.com=) 
    lijinghe1(副乡长) 的方法好像真的有问题啊,我今天试了还是不行,还是老毛病,作为library没问题作为exe有问题
      

  14.   

    各位能否深入的讨论一下如何象调用DLL中的函数那样,调用EXE文件中的函数。
      

  15.   

    方法也是有Host程序export函数,然后有主程序调用,现在问题是如果导出的函数是例如求和这种简单的函数c:=a+b这样的就没有问题,如果复杂些例如导出窗体或者其他的复杂的就有AV错误。
      

  16.   

    你试下,在你的程序中
    var p:pchar;
    begin
     getMem(p,...
     strcopy(p, ...  freeMem(p);这样来调用exe的输出函数!!!其它不用改
      

  17.   

    aiirii(ari-爱的眼睛) 
    不太明白,能否烦劳您给个全的
      

  18.   

    aiirii(ari-爱的眼睛) 
    老大不行啊,在GetMem(p,...)就有错误
    代码如下:
    {$IMAGEBASE $40000000}
    procedure Test(p: PChar); export ;stdcall;
    var
      x: PChar;
    begin
      getMem(x,length(p));
      strCopy(x,p);
      MessageBox(0, x, 'Test', MB_OK);
      freeMem(x);
    end;exports
      Test;
      

  19.   

    代码如下:
    我的代码运行是后没有问题,但是在exe中被别的exe调用有问题。问题情况如前所述。exe中函数代码:
    function XMLToPopupMenu(mPXMLNode: IXMLNode; mPopupMenu: TPopupMenu): Boolean; export; stdcall;
      procedure pXMLToPopupMenu(mXMLNode: IXMLNode; mMenuItem: TMenuItem);
      var
        I: Integer;
        vMenuItem: TMenuItem;
      begin
        if SameText(mXMLNode.NodeName, '#text') then exit;
        vMenuItem:= NewItem(mXMLNode.Attributes['caption'], scNone, False, True,
                                             LM.PopupMAction, 0, mXMLNode.NodeName);
        try
          vMenuItem.Tag:= strtoint(mXMLNode.Text);
        except
          vMenuItem.Tag:= 99999;
        end;
        mMenuItem.Add(vMenuItem);
        for I := 0 to mXMLNode.ChildNodes.Count - 1 do      (* 递归遍历xml的相关节点 *)
          pXMLToPopupMenu(mXMLNode.ChildNodes[I], vMenuItem);
      end;
    var
      I: Integer;
    begin
      Result:= False;
      if not (Assigned(mPXMLNode) and Assigned(mPopupMenu)) then exit;
      mPopupMenu.Items.Clear;
      for I := 0 to mPXMLNode.ChildNodes.Count - 1 do
        pXMLToPopupMenu(mPXMLNode.ChildNodes[I], mPopupMenu.Items);
      Result:= True;
    end; { XMLToPopupMenu }
    --------------------------------------------
    调用代码:
    var
      lib: THandle;
      kkk: function(mPXMLNode: IXMLNode; mPopupMenu: TPopupMenu):boolean; stdcall;
    begin
      lib := LoadLibrary('E:\例子\aa.exe');
      if lib = 0 then
        ShowMessage('Cannot load the module')
      else begin
        @kkk := GetProcAddress(lib, 'LoadMenu');
        if @kkk = nil then
          ShowMessage('Cannot GetProcAddress')
        else
        begin
          xml_stat.LoadFromFile('E:\例子\1.xml');
          kkk(xml_stat.DocumentElement.ChildNodes['menu_info'], plmm);
          Self.PopupMenu:= plmm;
        end;
          FreeLibrary(lib);
      end;
    end;
      

  20.   

    其实现在问题很明显,如果exe中是计算加减法这样的小函数c:= a+b这样的没问题,但是如果导出窗体什么的就有问题,而且如果是dll就没有问题
      

  21.   

    问题大概就是内存不能共享的问题。正在看...
    如果不创建新的菜单项,程序没有问题。
    一个傻傻的解决办法,先创建一批菜单项,用TLIST传进,在函数中只是根据XML修改这些项目的属性。
      

  22.   

    lijinghe1(副乡长) 
    你的方法思路上可以,但是不够灵活啊,我想到时候只要修改xml相应节点就可以实现菜单的改变。
    解析xml没有问题,现在确实是内存共享方面的问题,也可能是内存管理方面,觉得是内存冲突了,请您也帮忙,谢谢
      

  23.   

    问题没有解决,不过换方法继续我的工作了,这个帖子先不结,下周结,欢迎兄弟们继续讨论。
    各位可以去
    http://expert.csdn.net/Expert/topic/3044/3044699.xml?temp=.5793878
    结分,5793878明早结