你别笑我菜,我也很无奈! (10分)

  • 主题发起人 风雨燕归来
  • 开始时间
一样可以的啊,CreateProcess 的前两个参数分别是:
lpApplicationName 和 lpCommandLine
你第一个参数传空,第二个参数传你的ADP文件全名就可以了:)
 
还没搞定啊兄弟?
 
那我再给你说一个方法。
当你不管用什么方法打开一个任何类型的文件时,该窗口一般为当前的活动窗口。
你可以用GetForegroundwindow方法取得该句柄
h:=GetForegroundwindow;h为句柄变量。
然后再做处理。
不过再获取句柄前要sleep(2000),否则那个窗口句柄还没有创建。
 
确实如此。
不过你可以考虑查找注册表,找到相应扩展名是由谁打开的——就是找到可执行文件,然后再执行啊。
——一个笨方法,因为暂时挺忙的,不能想、尝试更好的办法
 
我也抱歉,这里其实有好多高手在帮你想办法了,这玩意我接触也不多,可能帮不上你什么了,不过你要是只要找到进程的句栟,你试试用下面的代码来改一下看
procedure TForm1.btn1Click(Sender: TObject);
const
PROCESS_TERMINATE=$0001;
var
ExeFileName: String;
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
ExeFileName := 'QQ123.EXE';
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0);//这里是找到后,强制结束了
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;

 
具体要实现什么样的功能,说出来,我用Pascal帮你写一段。
 
to wlmmlw:
那可太谢谢你了,是这样的,就我自做的程序里的窗体上点一个按钮,然后该窗体就让他最小化,之后,调用一个外部的文件,就是一个用Access打开的adp文件.此时主程序一直在调用处,暂停执行,等把这个ADP文件关闭后,让原先最小化的窗口恢复,就这样.以前是这样的.
Me.WindowState = 1
Me.Hide
On Error GoTo fff
pid = Shell("j2sell.exe", vbNormalFocus)
phnd = OpenProcess(&amp;H100000, 0, pid)
If phnd <> 0 then
WaitForSingleObject phnd, &amp;HFFFFFFFF
CloseHandle phnd
End If
Me.Show
Me.WindowState = 0
因为以前要调用的是exe文件,现在变成adp了,所以就没有办法了.
兄弟,最好是能帮我写一个dll是最好不过了.让我直接调就可以了,我也不必再把delphi变成VB了.
 
谢谢楼上的各位兄弟姐妹,另外beta兄,第二个参数设成文件名也不行呀,要不你试试,然后,你把它原样粘出来看看.
 
给你搞定了,使用FindExecutable [:D]
uses
shellapi;
procedure TForm1.Button1Click(Sender: TObject);
var
lExeName: pChar;
SUInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: string;
begin
GetMem(lExeName, 255);
if FindExecutable('E:/1.xls', 'E:/', lExeName) > 32 then
begin
ShowMessage(lExeName);
FillChar(SUInfo, SizeOf(SUInfo), #0);
with SUInfodo
begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := 0;
end;

if CreateProcess(lExeName, pChar('1.xls'), NIL, NIL,
FALSE, NORMAL_PRIORITY_CLASS, NIL,
'E:/', SUInfo, ProcInfo) then
{等待结束 }
begin
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
CloseHandle(ProcInfo.hProcess);
{清理句柄 }
CloseHandle(ProcInfo.hThread);
end;

end;
FreeMem(lExeName);
end;
 
就像 yzhshi 说的额这样就可以啦:)
 
各位大侠们.
小第有礼了.
刚接触delphi几天.
以后的日子里请大家多多关照.
 
多人接受答案了。
 
顶部