delphi调用MASM和LINK ( 积分: 200 )

  • 主题发起人 主题发起人 fuxiaojie
  • 开始时间 开始时间
F

fuxiaojie

Unregistered / Unconfirmed
GUEST, unregistred user!
我编译是能通过一切正常,但是链接是就生成不了EXE文件
代码如下:
编译的代码:
str1:=ExtractFileName(str);
int:=pos('.',str1);
str2:=copy(str1,1,int)+'obj';
if Length(str2)>12 then
begin
showmessage('该文件名太长(超过8个字符),没法编译!');
exit;
end;
str:='masm.exe '+str1+' '+str2+' 1.LIS 1.CRF';
if length(str)>25 then
begin
p:=pchar(str);
winexec(p,SW_HIDE);
sleep(500);
end;
链接代码:
str1:=ExtractFileName(sFileName);
if str1<>'' then
begin
int:=pos('.',str1);
str1:=copy(str1,1,int)+'OBJ';
if FileExists(str1) then
begin
str2:=copy(str1,1,int)+'MAP';
str3:=copy(str1,1,int)+'EXE';
//str2:=' NUL.MAP' ;
str:='link.exe '+str1+' '+str3+' '+str2;
p:=pchar(str);
winexec(p,SW_Normal );
sleep(400);
end
else
begin
Showmessage('无法链接该文件!');
end;
end;
 
我编译是能通过一切正常,但是链接是就生成不了EXE文件
代码如下:
编译的代码:
str1:=ExtractFileName(str);
int:=pos('.',str1);
str2:=copy(str1,1,int)+'obj';
if Length(str2)>12 then
begin
showmessage('该文件名太长(超过8个字符),没法编译!');
exit;
end;
str:='masm.exe '+str1+' '+str2+' 1.LIS 1.CRF';
if length(str)>25 then
begin
p:=pchar(str);
winexec(p,SW_HIDE);
sleep(500);
end;
链接代码:
str1:=ExtractFileName(sFileName);
if str1<>'' then
begin
int:=pos('.',str1);
str1:=copy(str1,1,int)+'OBJ';
if FileExists(str1) then
begin
str2:=copy(str1,1,int)+'MAP';
str3:=copy(str1,1,int)+'EXE';
//str2:=' NUL.MAP' ;
str:='link.exe '+str1+' '+str3+' '+str2;
p:=pchar(str);
winexec(p,SW_Normal );
sleep(400);
end
else
begin
Showmessage('无法链接该文件!');
end;
end;
 
那位高手帮我解决一下好吗。急呀
 
你在winexec(p,SW_Normal );设断点
把p得值取出来放到命令提示符下执行有没有问题?
 
没问题呀
 
主要是链接了OBJ文件以后,就执行不下去其他的了
 
你拥shellexcute 这个API函数试试看呢
shellexcute(handle,'open',p,nil,nil,SW_HIDE)
 
还是不行呀
 
如果你们有汇编的可以试试,
 
procedure TForm1.Button1Click(Sender: TObject);
var
v_Sre:String;
begin
v_Sre:=GetCurrentDir;
SetCurrentDir('C:/masm32/Source/Sender');
WinExec('link /SUBSYSTEM:WINDOWS /LIBPATH:c:/masm32/lib C:/masm32/Source/Sender/sender.obj',SW_HIDE);
SetCurrentDir(v_Sre);
end;

我现在学习得汇编工具可能和你得不同
我在这个代码中设置了系统默认路径SetCurrentDir('C:/masm32/Source/Sender');
也就是exe文件的输出位置
你再试试
 
TO:Avalon
你的MSN是多少我可以加你吗
我的是fuxiaojie@hotmail.com
 
TO:Avalon
你的系统是什么呀,
我这里好像还是不行,
能不能具体一点
 
你用的是那个版本,
我是masm 6。1的
 
function f_GetShortName(p_Source:String): String;
var
p_Char:PChar;
begin
try
GetMem(p_Char,1024);
GetShortPathName(PChar(p_Source),PChar(p_Char),1024);
Result:=Trim(String(p_Char));
FreeMem(p_Char);
except
Result:='';
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
str,str1,str2,str3,sFileName,str4:string;
f:system.TextFile;
p,b:pchar;
int:integer;
begin
str1:=f_GetShortName('C:/masm32/Source/FirstWindow/33333333.OBJ');
int:=pos('.',str1);
str2:=copy(str1,1,int)+'MAP';
str3:=copy(str1,1,int)+'EXE';
str:='link.exe "'+str1+'" ,'+str3+',,, >> out.txt';
p:=pchar(str);
winexec(p,SW_NORMAL);
end;

这个是我根据你那个汇编工具写的 也编译出了程序
我想说 你要注意2个问题
1 masm不支持长文件名 所以要转换一下
2 输出时 exe obj map 之间要用','隔开

我这个例子中link文件和程序在一起 obj文件在另外的目录中
 
procedure TForm1.Button1Click(Sender: TObject);
var
str,str1,str2,str3,sFileName,str4:string;
f:system.TextFile;
p,b:pchar;
int:integer;
begin
str1:=f_GetShortName('C:/masm32/Source/FirstWindow/33333333.OBJ');
int:=pos('.',str1);
str2:=copy(str1,1,int)+'MAP';
str3:=copy(str1,1,int)+'EXE';
str:='link.exe "'+str1+'" ,'+str3+',,, >> out.txt';
p:=pchar(str);
winexec(p,SW_NORMAL);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
str1,str2,str,str4,str0:string;
s,s0,s1,s2,s3,s4,s5,s6,s7:string;
ss1,ss2:string;
p:pchar;
int:integer;
f:system.TextFile;
i:integer;
begin
str1 := f_GetShortName('C:/masm32/Source/FirstWindow/33333333.ASM');
int:=pos('.',str1);
str2:=copy(str1,1,int)+'obj';
str:='masm.exe '+str1+','+str2+' 1.LIS 1.CRF >> out.txt';
p:=pchar(str);
winexec(p,SW_NORMAL);
end;
 
接受答案了.
 
后退
顶部