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;
代码如下: 我的代码运行是后没有问题,但是在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;
但是我的调用有问题啊,和DLL一样调用吗?
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;
function XMLToPopupMenu(mPXMLNode: IXMLNode; mPopupMenu: TPopupMenu): Boolean;
mPXMLNode是一个xml中的一个节点
mPopupMenu是快捷菜单
函数功能是遍历给定节点的xml生成快捷菜单
调用时候有access violation的错误
这种简单的调用我也试过好用,不过我的那个有问题:(
请帮忙谢谢
您这个方法里面也有access violation的错误
您给我的那篇代码你试过好用了?
我也来想想办法。。
谢谢你,我在线等,他的那个代码如果编译成dll就可以用了
http://expert.csdn.net/Expert/topic/3044/3044699.xml?temp=.5382654
program TestExe; //输出函数的Exeuses
Windows;
{$IMAGEBASE $40000000} //加上这个就OK了
procedure Test(p: PChar); export; stdcall;
begin
MessageBox(0, p, 'Test', MB_OK);
end;
//用调入的LIBRARY的基址不能和宿主EXE文件基址发生冲突。
感谢您的回答,为什么上面的那段代码加了{$IMAGEBASE $40000000}可以,我的代码加了还是有问题这个时候av错误at address 00000000
解决马上揭帖,谢谢
lijinghe1(副乡长) 的方法好像真的有问题啊,我今天试了还是不行,还是老毛病,作为library没问题作为exe有问题
var p:pchar;
begin
getMem(p,...
strcopy(p, ... freeMem(p);这样来调用exe的输出函数!!!其它不用改
不太明白,能否烦劳您给个全的
老大不行啊,在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;
我的代码运行是后没有问题,但是在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;
如果不创建新的菜单项,程序没有问题。
一个傻傻的解决办法,先创建一批菜单项,用TLIST传进,在函数中只是根据XML修改这些项目的属性。
你的方法思路上可以,但是不够灵活啊,我想到时候只要修改xml相应节点就可以实现菜单的改变。
解析xml没有问题,现在确实是内存共享方面的问题,也可能是内存管理方面,觉得是内存冲突了,请您也帮忙,谢谢
各位可以去
http://expert.csdn.net/Expert/topic/3044/3044699.xml?temp=.5793878
结分,5793878明早结