delphi调用cmd的两种方法
Delphi打开外部程序或文件的方法与命令
Delphi打开外部程序或文件的方法与命令ShellExecute(hWnd: HWND; {指定父窗口句柄}Operation: PChar; {指定动作, 譬如: open、print}FileName: PChar; {指定要打开的文件或程序}Parameters: PChar; {给要打开的程序指定参数; 如果打开的是文件这里应该是nil} Directory: PChar; {缺省目录}ShowCmd: Integer {打开选项}): HINST; {执行成功会返回应用程序句柄; 如果这个值<= 32, 表示执行错误}//返回值可能的错误有:= 0 {内存不足}ERROR_FILE_NOT_FOUND = 2; {文件名错误}ERROR_PATH_NOT_FOUND = 3; {路径名错误}ERROR_BAD_FORMAT = 11; {EXE 文件无效}SE_ERR_SHARE = 26; {发生共享错误}SE_ERR_ASSOCINCOMPLETE = 27; {文件名不完全或无效}SE_ERR_DDETIMEOUT = 28; {超时}SE_ERR_DDEFAIL = 29; {DDE 事务失败}SE_ERR_DDEBUSY = 30; {正在处理其他DDE 事务而不能完成该DDE 事务} SE_ERR_NOASSOC = 31; {没有相关联的应用程序}//ShowCmd参数可选值:SW_HIDE = 0; {隐藏}SW_SHOWNORMAL = 1; {用最近的大小和位置显示, 激活}SW_NORMAL = 1; {同SW_SHOWNORMAL}SW_SHOWMINIMIZED = 2; {最小化, 激活}SW_SHOWMAXIMIZED = 3; {最大化, 激活}SW_MAXIMIZE = 3; {同SW_SHOWMAXIMIZED}SW_SHOWNOACTIVATE = 4; {用最近的大小和位置显示, 不激活}SW_SHOW = 5; {同SW_SHOWNORMAL}SW_MINIMIZE = 6; {最小化, 不激活}SW_SHOWMINNOACTIVE = 7; {同SW_MINIMIZE}SW_SHOWNA = 8; {同SW_SHOWNOACTIVATE}SW_RESTORE = 9; {同SW_SHOWNORMAL}SW_SHOWDEFAULT = 10; {同SW_SHOWNORMAL}SW_MAX = 10; {同SW_SHOWNORMAL}--------------------------------------------------------------------------------//举例说明更多问题(别忘了uses ShellAPI;):{譬如用记事本打开一个文件}beginShellExecute(Handle, 'open', 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL);end;--------------------------------------------------------------------------------{第一个参数是用来当作错误提示窗口的父窗口的, 不能是nil, 可以是0(也就是桌面窗口)} beginShellExecute(0, 'open', 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL); end;--------------------------------------------------------------------------------{第二个参数如果是nil, 也会默认位open}beginShellExecute(0, nil, 'notepad.exe', 'C:\WINDOWS\SchedLgU.Txt', nil, SW_SHOWNORMAL);end;--------------------------------------------------------------------------------{文件路径可以放在参数五}beginShellExecute(0, nil, 'notepad.exe', 'SchedLgU.Txt', 'C:\WINDOWS', SW_SHOWNORMAL);end;--------------------------------------------------------------------------------{把参数三直接指定为要打开的文件, 文件将用对应默认程序打开; 次数参数四应为nil} beginShellExecute(0, nil, 'SchedLgU.Txt', nil, 'C:\WINDOWS', SW_SHOWNORMAL);end;--------------------------------------------------------------------------------{如果文件在: 程序目录/当前目录/System32/Windows/PATH环境变量中, 参数五也可以nil} beginShellExecute(0, nil, 'SchedLgU.Txt', nil, nil, SW_SHOWNORMAL);end;--------------------------------------------------------------------------------{如果参数三是个文件, 可以用参数二命令打印}beginShellExecute(0, 'print', 'SchedLgU.Txt', nil, nil, 1);end;--------------------------------------------------------------------------------{用IE 打开网页}beginShellExecute(Handle, 'open', 'IExplore.EXE', 'about:blank', nil, SW_SHOWNORMAL);end;--------------------------------------------------------------------------------{用火狐打开网页}beginShellExecute(Handle, 'open', 'firefox.exe', 'about:blank', nil, SW_SHOWNORMAL);end;--------------------------------------------------------------------------------来源:(/s/blog_4b05f08e0100h5py.html) - Delphi打开外部程序或文件_漂忆_新浪博客{用默认浏览器打开网页}beginShellExecute(Handle, 'open', 'Explorer.exe', 'about:blank', nil, SW_SHOWNORMAL);end;--------------------------------------------------------------------------------{还是用默认浏览器打开网页}beginShellExecute(0, nil, '', nil, nil, 1);end;Delphi技巧集六(等待执行完一个外部程序再执行另一个程序)Posted on 2008-08-10 23:20 清枫&明月阅读(80) 评论(0) 编辑收藏网摘所属分类: Delphi编程资料unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementationuses ShellAPI; //注意{$R *.dfm}functionExecAppWait(AppName, Params: string): Boolean;varShellExInfo: TShellExecuteInfo;beginFillChar(ShellExInfo, SizeOf(ShellExInfo), 0);withShellExInfo do begincbSize := SizeOf(ShellExInfo);fMask := see_Mask_NoCloseProcess;Wnd :=Application.Handle;lpFile := PChar(AppName);lpParameters := PChar(Params);nShow := sw_ShowNormal;end;Result :=ShellExecuteEx(@ShellExInfo);if Result thenwhileWaitForSingleObject(ShellExInfo.HProcess, 100) = WAIT_TIMEOUT do beginApplication.ProcessMessages;ifApplication.Terminated then Break;end;end;procedure TForm1.Button1Click(Sender: TObject);const { 连续运行下面这四个EXE文件}EXEFILES : array[1..4] of string =('calc.exe', 'mspaint.exe', 'Notepad.exe', 'wordpad.exe'); varSuccess: Boolean;InstanceID: THandle;I : integer;beginfor I := Low(EXEFILES) to High(EXEFILES) dobeginApplication.Minimize;Success := False;trySuccess :=ExecAppWait(EXEFILES[I], '')finallyApplication.Restore;if not Success thenShowMessage(Format('Application %d failed: %s', [ I, EXEFILES[I] ])); end;end;end;end.。
如何在DELPHI中调用外部程序
如何在Delphi中调用外部程序本实例介绍如何在自己的程序中调用指定的Windows程序。
首先启动一个新的项目,在空白的窗体上添加4个TButton组件。
添加组件后的窗体如图1所示。
图1添加组件后的窗体其中WinExec按钮用于以WinExec函数来调用指定的Windows程序。
ShellExecute按钮用于以ShellExecute函数来调用指定的Windows程序。
CreateProcess按钮和TerminateProcess按钮用于实现对被调用程序更全面的操作,前者用于调用指定的Windows 程序,而后者则用于终止被调用的Windows程序。
以WinExec函数的方式来调用指定的Windows程序的响应代码如下:其中WinExec函数的第1个参数表示了被调用程序的路径和名称,第2个参数表示了程序的显示方式。
以ShellExecute函数的方式来调用指定的Windows程序的响应代码如下:其中ShellExecute用于打开与指定文件关联在一起的程序文件。
第1个参数用于指定一个窗口的句柄;第2个参数指定了程序运行的类别,如’Open’或’Print’;第3个参数指定了想用关联程序打印或打开的一个程序名或文件名;如果第3个参数中指定了一个可执行文件,那么第4个参数就是传递给执行程序的参数;第5个参数指定了可执行程序的完整路径。
最后一个参数用于设定程序运行方式。
下面来介绍利用CreateProcess函数和TerminateProcess函数如何实现对被调用程序更全面的操作。
首先定义3个全局变量:利用CreateProcess函数调用指定程序的响应代码如下:调用CreateProcess函数激活C:\WINNT\Notepad.exe程序后,把它的进程信息存储在变量PI中,然后通过下面的语句来关闭本实例打开的C:\WINNT\Notepad.exe程序:程序代码如下:保存文件,然后按F9键运行程序,程序运行的初始画面如图2所示。
Delphi利用管道实现执行DOS控制台指令
Delphi利用管道实现执行DOS控制台指令Delphi利用管道实现执行DOS控制台指令来源:转载审核:bahamut8348 发布时间:2013-04-11(***********函数名: ExecCommand **功能: 执行控制台指令 **参数: ** lpCommand: 指令串 ** lpOutput: 输出缓冲区 ** dwOutputLength: 缓冲区长度 ** bWaitTerminate: 是否等待进程结束( 如果不等待则在读满缓冲区后跳出函数 ) ** lpExitCode: 返回值 **返回值: ** 返回实际读取的控制台输出信息的长度 ***********)function ExecCommand(lpCommand: PWideChar; lpOutput: PAnsiChar;cchOutput: DWORD; bWaitTerminate: BOOL; lpExitCode: PD WORD): DWORD;constCOMMAND_NT: PWideChar = '\cmd.exe /c '#0;COMMAND_98: PWideChar = ' /c '#0;vardwReadBytes, dwExitCode: DWORD;lpCommandFileName: PWideChar;saPipeAttributes: TSecurityAttributes;hReadPipe, hWritePipe, hStdOutput: THandle;viOSInfo: TOSVersionInfoW;siStartupInfo: TStartupInfo;piProcessInfo: TProcessInformation;bRead: BYTE;bReturn: BOOL;beginResult:= 0;// 清空读缓冲区if cchOutput > 0 thenZeroMemory(lpOutput, cchOutput * SizeOf(lpOutput^));// 设置管道结构saPipeAttributes.nLength:= SizeOf(saPipeAttributes);saPipeAttributes.bInheritHandle:= True;saPipeAttributes.lpSecurityDescriptor:= nil;// 创建管道if not CreatePipe(hReadPipe, hWritePipe, @saPipeAttributes , 0) thenExit; // 管道创建失败则退出// 获取原输出管道句柄hStdOutput:= GetStdHandle(STD_OUTPUT_HANDLE);// 设置输出管道SetStdHandle(STD_OUTPUT_HANDLE, hWritePipe);siStartupInfo.cb:= SizeOf(siStartupInfo);GetStartupInfoW(siStartupInfo);siStartupInfo.dwFlags:= STARTF_USESHOWWINDOW or STA RTF_USESTDHANDLES;siStartupInfo.hStdOutput:= hWritePipe; // 输出管道siStartupInfo.hStdError:= hWritePipe; // 错误信息siStartupInfo.wShowWindow:= SW_HIDE; // 显示方式FillChar(viOSInfo, SizeOf(viOSInfo), 0);viOSInfo.dwOSVersionInfoSize:= SizeOf(viOSInfo);if not GetVersionExW(viOSInfo) then // 取操作系统版本信息beginSetStdHandle(STD_OUTPUT_HANDLE, hStdOutput);CloseHandle(hReadPipe);CloseHandle(hWritePipe);Exit;end;lpCommandFileName:= AllocMem((MAX_PATH + Length(lp Command) + 1) * SizeOf(lpCommandFileName^));if viOSInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then // NT系统begin// 取系统文件夹if GetSystemDirectoryW(lpCommandFileName, MAX_PATH) = 0 thenbegin // 出错SetStdHandle(STD_OUTPUT_HANDLE, hStdOutput);CloseHandle(hReadPipe);CloseHandle(hWritePipe);FreeMem(lpCommandFileName);Exit;end;lstrcatW(lpCommandFileName, COMMAND_NT);endelse // 98、95…lstrcatW(lpCommandFileName, COMMAND_98);// 生成调用字符lstrcatW(lpCommandFileName, lpCommand);// 创建进程bReturn:= CreateProcessW(nil, lpCommandFileName, nil, nil , True, 0, nil, nil, siStartupInfo, piProcessInfo);// 还原句柄SetStdHandle(STD_OUTPUT_HANDLE, hStdOutput);// 销毁对象CloseHandle(hWritePipe);if bReturn thenbegin// 2013-01-14提到读pipe前等待进程结束, 这样可以保证读出全部的输出信息.// 等待进程结束if bWaitTerminate thenbeginwhile True do// 等待进程执行完毕, 如果返回WAIT_TIMEOUT则表示进程正在执行中if WaitForSingleObject(piProcessInfo.hProcess, 10) <> WAIT _TIMEOUT thenBreak;while True do// 获取进程返回值if not GetExitCodeProcess(piProcessInfo.hProcess, dwExitCo de) thenBreakelse if dwExitCode <> STILL_ACTIVE thenBreakelseSleep(10);if lpExitCode <> nil thenlpExitCode^:= dwExitCode;end;// 读返回信息if PeekNamedPipe(hReadPipe, @bRead, 1, @dwReadBytes, nil, nil) {and (dwReadBytes > 0)} thenbeginif (cchOutput > 0) and (lpOutput <> nil) thenReadFile(hReadPipe, lpOutput^, cchOutput * SizeOf(lpOutp ut^), dwReadBytes, nil)elsedwReadBytes:= 0;end;Result:= dwReadBytes;// 销毁对象CloseHandle(piProcessInfo.hProcess);end;FreeMem(lpCommandFileName);CloseHandle(hReadPipe);end;==========调用:varp: array[0..4096] of ansichar;beginExecCommand('ping 127.0.0.1', p, sizeof(p), true, nil); messageboxA(0, p, nil, mb_ok);end;。
Delphi封装MSComm供C#调用
Delphi设计串口通信组件1、创建一个ActiveX Library这样就建立一个COM 组件,保存工程名称为MyCommTest.然后新建一个ActiveX Form,命名为frmMyActivex点击OK后,delphi会自动生成MyCommTest_TLB.pas及窗体frmMyActivexlmpl1.在frmMyActivexlmpl1界面拖放一个MSComm控件和一个Timer控件,Time的Enable设置为False,interval设置为300ms.(可适当将界面调整小点)。
然后点击”View” -> “Type Library”,打开类型库界面.我们点击lfrmMyActivex接口新建一个属性,比如卡号CardNo.\设置卡号的名字,类型为BSTR (BSTR为Delphi兼容COM接口的字符串类型),点击”刷新”图标,自动将该属性加入到接口模块中.我们可以看到在MyCommTest_LIB.pas的IfrmMyActivex = interface(IDispatch)接口中增加了一格CardNo属性.在unit frmMyActivexImpl1中增加了两个属性操作函数现在我们回到unit frmMyActivexImpl1;我们需要实现对属性的操作,保存属性数据,就需要在该单元中新建一个私有的_CardNo变量。
然后需要手动实现两个属性操作函数的内容,在属性函数中填入以下代码。
为了实现对串口的操作,我们还需要自定义几个函数用于打开,关闭串口及发送串口通信指令。
点击”View” -> “Type Library”,进入类型库界面右键点击IfrmMyActivex,选择”new”-Method输入函数名称InitComm然后选择Parameters选项卡,生成一个输入参数CommPort 串口号,类型为Short点击刷新按钮,刷新接口模块,,我们在MyCommTest_TLB.pas界面看到,已经自动生成函数。
VC中调用cmd命令的四种方式
1. system方法:原型:view plain1.int __cdec l system(constchar *);例如:view plain1.system("ipconf ig");2. WinExe c方法:相比于sys tem方法,WinExe c方法多了一个窗口参数:原型:view plain1.UINT WinExe c(2. LPCSTR lpCmdL ine,3. UINT uCmdSh ow4.);例如:WinExe c("ipconf ig", SW_SHO W);参数可以是:SW_SHO W,,SW_SHO WMAXI MIZED,SW_SHO WMINI MIZED等等,总体用法是差不多的。
3. ShellE xecut e方法:这个方法主要用于ope n,edit,find等方法的操作:原型:view plain1.HINSTA NCE ShellE xecut e(2. HWND hwnd,3. LPCTST R lpOper ation,4. LPCTST R lpFile,5. LPCTST R lpPara meter s,6. LPCTST R lpDire ctory,7. INT nShowC md8.);例如:view plain1.ShellE xecut e(NULL,"open","abc.xls",NULL,NULL,SW_HID E);//打开默认路径的abc.xls文件4.可回显的调用方法:这个方法步骤比较复杂,是通过创建一个新进程来模拟cmd命令行,将写命令行和回显通过管道的方式呈现。
例如:view plain1.void CTestM FCDlg::OnOK()2.{3. // TODO: Add extravalida tionhere4. SECURI TY_AT TRIBU TES sa;5. HANDLE hRead,hWrite;6.7. sa.nLengt h = sizeof(SECURI TY_AT TRIBU TES);8. sa.lpSecu rityD escri ptor= NULL;9. sa.bInher itHan dle = TRUE;10.11. if(!Create Pipe(&hRead,&hWrite,&sa,0))12. {13. Messag eBox("Create PipeFailed");14. return;15. }16.17. STARTU PINFO si;18. PROCES S_INF ORMAT ION pi;19.20. ZeroMe mory(&si,sizeof(STARTU PINFO));21. si.cb = sizeof(STARTU PINFO);22. GetSta rtupI nfo(&si);23. si.hStdEr ror = hWrite;24. si.hStdOu tput= hWrite;25. si.wShowW indow = SW_HID E;26. si.dwFlag s = STARTF_USES TDHAN DLES| STARTF_USES HOWWI NDOW;27.28. char cmdlin e[200];29. CStrin g tmp,stredi t2;30. GetDlg ItemT ext(IDC_ED IT_CM D,stredi t2);31. tmp.Format("cmd /C %s",stredi t2);32. sprint f(cmdlin e,"%s",tmp);33.34. if(!Create Proce ss(NULL,cmdlin e,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))35. {36. Messag eBox("Create Proce ss failed!");37. return;38. }39. CloseH andle(hWrite);40.41. char buffer[4096] = {0};42. CStrin g strOut put;43. DWORDbytesR ead;44.45. while(1)46. {47. if(NULL == ReadFi le(hRead,buffer,4095,&bytesR ead,NULL))48. {49. break;50. }51. strOut put += buffer;52. SetDlg ItemT ext(IDC_ED IT_TE XT,strOut put);53. Update Windo w();54. Sleep(1000);55. }56. CloseH andle(hRead);57.}以上是在一个MFC中点击OnOK按钮后,将IDC_E DIT_C MD编辑框中的命令执行,并将1秒内c md命令的回显答应到IDC_E DIT_T EXT编辑框中的实现。
delphi winexec cmd语句
delphi winexec cmd语句在Delphi中,你可以使用`WinExec`函数来执行命令行语句。
`WinExec`函数允许你在Windows 操作系统上执行外部程序或者命令。
以下是一个简单的示例,演示如何在Delphi中使用`WinExec`来执行cmd命令:```delphiunit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)btnRunCmd: TButton;procedure btnRunCmdClick(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.btnRunCmdClick(Sender: TObject);varCmd: string;begin// 要执行的cmd命令Cmd := 'cmd.exe /c dir C:\'; // 例如,列出C盘根目录下的文件// 使用WinExec执行cmd命令WinExec(PChar(Cmd), SW_SHOWNORMAL);end;end.```在上述示例中,单击按钮时,`btnRunCmdClick`事件处理程序将调用`WinExec`函数执行指定的cmd命令。
请注意,这里使用了`SW_SHOWNORMAL`参数,它指示系统显示新创建的进程的主窗口,并将其激活。
请注意,`WinExec`函数在较新的Windows版本中已被弃用,建议使用更现代的方法,如使用`CreateProcess`函数。
delphi 函数里面调用窗口的方法
delphi 函数里面调用窗口的方法(最新版3篇)《delphi 函数里面调用窗口的方法》篇1在Delphi 中,如果在函数内部需要调用窗口的方法,可以使用以下两种方式:1. 使用窗体的方法名称直接调用:如果在函数内部需要调用窗口的方法,可以使用窗体的方法名称直接调用。
例如,如果窗体名为Form1,需要调用其方法Name1,则可以在函数内部使用以下代码进行调用:```1;```这种方式调用窗口方法时,需要保证窗体已经初始化,否则会出现异常。
2. 使用窗体的方法指针进行调用:如果在函数内部需要调用窗口的方法,可以使用窗体的方法指针进行调用。
例如,如果窗体名为Form1,需要调用其方法Name1,则可以在函数内部使用以下代码进行调用:```varMethod: TMethod;begin// 获取窗体Form1 的方法指针Method := Form1.MethodName1;// 调用方法Method();end;```这种方式调用窗口方法时,不需要保证窗体已经初始化,因为方法指针是在运行时获取的。
《delphi 函数里面调用窗口的方法》篇2在Delphi 中,如果在函数内部需要调用窗口的方法,可以使用以下方式:1. 在函数内部创建一个窗口对象,然后调用窗口的方法。
例如:```function CallWindowMethod(Window: TWindow): Boolean;varMethodName: string;Method: TMethod;begin// 获取窗口类的方法MethodName := "WindowMethod";Method := Window.GetType().GetMethod(MethodName);if Method = nil thenraise Exception.Create("Window method not found");// 调用窗口方法Method.Invoke(Window, []);// 返回布尔值表示是否成功调用Result := True;end;```2. 在函数内部使用全局变量或类变量保存窗口对象,然后调用窗口的方法。
delphi取得任意程序的命令行
delphi取得任意程序的命令行program GetCommandLineExDemo;uses Windows;constSystemHandleInformation = 16;ProcessBasicInformation = 0;STATUS_SUCCESS = cardinal($00000000);SE_DEBUG_PRIVILEGE =20;STATUS_ACCESS_DENIED = cardinal($C0000022);STATUS_INFO_LENGTH_MISMATCH = cardinal($C0000004);SEVERITY_ERROR = cardinal($C0000000);TH32CS_SNAPPROCESS = $00000002; // 模块列表快照JOB_OBJECT_ALL_ACCESS = $1f001f;typeTPROCESSENTRY32 = recorddwSize: DWORD;cntUsage: DWORD;th32ProcessID: DWORD; // this processth32DefaultHeapID: DWORD;th32ModuleID: DWORD; // associated execntThreads: DWORD;th32ParentProcessID: DWORD; // this process's parent processpcPriClassBase: Longint; // Base priority of process's threads dwFlags: DWORD;szExeFile: array[0..MAX_PATH - 1] of Char;// Pathend;typeUSHORT = Word;UNICODE_STRING = packed RecordLength : USHORT;MaximumLength: USHORT;Buffer : PWideString;end;RTL_USER_PROCESS_PARAMETERS = packed recordReserved1 : array[0..15] of Byte;Reserved2 : array[0..9] of Pointer;ImagePathName: UNICODE_STRING;CommandLine : UNICODE_STRING;end;PRTL_USER_PROCESS_PARAMETERS = ^RTL_USER_PROCESS_PARAMETERS;PEB = packed recordReserved1 : array[0..1] of Byte;BeingDebugged: ByteBool;Reserved2 : Byte;Reserved3 : array[0..1] of Pointer;Ldr : Pointer;ProcessParameters: PRTL_USER_PROCESS_PARAMETERS;Reserved4 : array[0..103]of Byte;Reserved5 : array[0..51]of Pointer;end;PPEB = ^PEB;PROCESS_BASIC_INFORMATION = packed recordExitStatus : DWORD;PebBaseAddress: PPEB;AffinityMask : DWORD;BasePriority : DWORD;uUniqueProcessId: ULong;uInheritedFromUniqueProcessId: ULong;end;TProcessBasicInformation = PROCESS_BASIC_INFORMATION;function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD) : THandle ; stdcall; external 'kernel32.dll' name 'CreateToolhelp32Snapshot';function Process32First(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL ; stdcall; external 'kernel32.dll' name 'Process32First';function Process32Next(hSnapshot: THandle; var lpme: TPROCESSENTRY32): BOOL ; stdcall; external 'kernel32.dll' name 'Process32Next';function NtQueryInformationProcess(ProcessHandle: THandle;ProcessInformationClass: Byte;ProcessInformation: Pointer;ProcessInformationLength: ULONG;ReturnLength: PULONG): DWORD; stdcall; external 'ntdll.dll';function EnablePrivilege(const PrivName: string; const Enable: Boolean = true): Boolean;varhToken: THandle;PrivId: Int64;tkp, PreviousState: TTokenPrivileges;ReturnLength: DWORD;beginResult:=False;if not LookupPrivilegeValue(nil,PChar(PrivName),PrivId) then exit;if not OpenProcessT oken(GetCurrentProcess,TOKEN_ADJUST_PRIVILE GES or TOKEN_QUERY,hT oken) then exit;tryReturnLength:=0;tkp.PrivilegeCount:=1;tkp.Privileges[0].Luid:=PrivId;if Enable then tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLEDelse tkp.Privileges[0].Attributes:=0;Result:=AdjustTokenPrivileges(hToken,false,tkp,SizeOf(TToke nPrivileges),PreviousState,ReturnLength);finallyCloseHandle(hT oken);end;end;function GetProcessCmdLine(PID: Cardinal): string;constSE_DEBUG_NAME = 'SeDebugPrivilege';ProcessBasicInformation = 0;varh : THandle;pbi : TProcessBasicInformation;ret : Cardinal;r : Cardinal;ws : WideString;aPEB : PEB;str:string;i:integer;ProcPar: RTL_USER_PROCESS_PARAMETERS;beginResult:='';str:='';if PID = 0 then PID:=GetCurrentProcessID;tryh:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,PID);if h=0 then exit;tryret:=NtQueryInformationProcess(h,ProcessBasicInformation ,@PBI,SizeOf(PBI),@r);if ret=0 thenrepeatif (not ReadProcessMemory(h,pbi.PebBaseAddress,@aPEB,SizeOf(aPEB ),r)) or (r<>SizeOf(aPEB)) then break;if (notReadProcessMemory(h,aPEB.ProcessParameters,@ProcPar,SizeO f(ProcPar),r)) or (r<>SizeOf(ProcPar)) then break;SetLength(ws,mandLine.Length div 2);if (not ReadProcessMemory(h,mandLine.Buffer,PWideChar (ws),mandLine.Length,r)) or (r<>mandLine.Length) then break;Result:=ws;until True;finallyCloseHandle(h);end;finallyend;end;function Trim(const S: string): string;varI, L: Integer;beginL := Length(S);I := 1;while (I <= L) and (S[I] <= ' ') doInc(I);if I > L thenResult := ''elsebeginwhile S[L] <= ' ' doDec(L);Result := Copy(S, I, L - I + 1);end;end;function UpperCase(const S: string): string;varCh: Char;L: Integer;Source, Dest: PChar;beginL := Length(S);SetLength(Result, L);Source := Pointer(S);Dest := Pointer(Result);while L <> 0 dobeginCh := Source^;if (Ch >= 'a') and (Ch <= 'z') thenDec(Ch, 32);Dest^ := Ch;Inc(Source);Inc(Dest);Dec(L);end;end;Function findprocess(TheProcName:String):DWORD; varisOK:Boolean;ProcessHandle:Thandle;ProcessStruct:TProcessEntry32;beginProcessHandle:=createtoolhelp32snapshot(Th32cs_snappro cess,0);processStruct.dwSize:=sizeof(ProcessStruct);isOK:=process32first(ProcessHandle,ProcessStruct);Result:=0;while isOK dobeginifTrim(UpperCase(TheProcName))=Trim(UpperCase(ProcessStruct. szExeFile)) thenbeginResult:=ProcessStruct.th32ProcessID;CloseHandle(ProcessHandle);exit;end;isOK:=process32next(ProcessHandle,ProcessStruct);end;CloseHandle(ProcessHandle);end;beginmessagebox(0,pchar(GetProcessCmdLine(findprocess('nod32.exe'))), 'aa', 0);end.。
delphi调试技巧
delphi调试技巧Delphi开发的调试技巧1、设置调试选项Delphi主菜单。
【Project】->【Options】,或单击工程管理器中的【Project Options】按钮。
显示Project Options,选择Complier<1>选中 Debug Information :把调试信息嵌入到DCU单元文件,会加大编译后的DCU文件,但不会影响最后生成的exe的大小和执行速度。
同时激活【Search】菜单中的【Find Error】命令。
当文件中包含调试信息并得到一个运行时错误(run-time error),记录下Delphi提供的16进制地址,在【Search】->【Find Error】中输入,Delphi将重新编译程序,并停留在产生错误的命令行。
<2>Local symbols:决定调试器能否看到在Implementation中定义的局部变量。
<3>Reference infoj选项/Definition Only选项是否产生应用程序中对象标识符的引用信息。
信息和对象代码存在dcu文件中,可以使用对象浏览器查看。
如果Definition Only 选项同时选中,编译器将生成标识符定义位置的信息,能够激活对象浏览器的Refenrence页。
如果不选,Dcu文件更小。
编辑器命令{$D} Debug Information{$L} Local Information{$Y} Symbol Information{$C} Assertions2、使用内部调试器<1> 命令行参数在【Run】->【Parameters】中设置<2>断点条件断点使源代码断点只有在满足某个条件时才有效。
在【View】->[Debug windows]->【BreakPoints】打开“BreakPoint List”对话框,右击断点,从弹出菜单中选择属性。
Delphi命令行编译指南
Delphi命令行编译指南Borland出品的Delphi,有着闪电般的编译速度,但是在界面控件使用较多、工程项目较大的时候,编译一个工程仍需要一段时间,打开庞大的Delphi IDE,也需要时间。
其实,在一个工程开发结束,调试完成之后的Release编译,完全可以用命令行来执行,因为Delphi的编译器参数不像C++编译器那样复杂。
笔者把Delphi联机手册中关于命令行编译(command-line compiler)的几篇主题作了翻译,希望对Delphi开发人员有帮助。
目录1Command-line compiler命令行编译器2Command-line compiler options命令行编译选项3Compiler directive options编译器指令选项4Compiler mode options编译模式选项5DCC32.CFG file DCC32.CFG配置文件6Debug options调试选项7Directory options目录选项8IDE command-line options IDE命令行选项9Generated files几个IDE自动产生的文件介绍1Command-line compiler命令行编译器Delphi's command-line compiler (dcc32.EXE) lets you invoke all the functions of the IDE compiler (DELPHI32.EXE) from the DOS command line (see IDE command-line options. Run the command-line compiler from the DOS prompt using the syntax:Delphi’s命令行编译器(dcc32.exe)允许你从DOS命令行方式(参照:IDE命令行选项)实现IDE编译器(delphi32.exe)的所有功能。
DELPHI与WINDOWS管道操作
什么是管道?参考《WIN32汇编编程》是这样描述的Windows引入了多进程和多线程机制。
同时也提供了多个进程之间的通信手段,包括剪贴板、DDE、OLE、管道等,和其他通信手段相比,管道有它自己的限制和特点,管道实际上是一段共享内存区,进程把共享消息放在那里。
并通过一些API提供信息交换。
管道是两个头的东西,每个头各连接一个进程或者同一个进程的不同代码,按照管道的类别分有两种管道,匿名的和命名的;按照管道的传输方向分也可以分成两种,单向的双向的。
根据管道的特点,命名管道通常用在网络环境下不同计算机上运行的进程之间的通信(当然也可以用在同一台机的不同进程中)它可以是单向或双向的;而匿名管道只能用在同一台计算机中,它只能是单向的。
匿名管道其实是通过用给了一个指定名字的有名管道来实现的。
使用管道的好处在于:读写它使用的是对文件操作的api,结果操作管道就和操作文件一样。
即使你在不同的计算机之间用命名管道来通信,你也不必了解和自己去实现网络间通信的具体细节。
使用匿名管道的步骤如下:使用CreatePipe建立两个管道,得到管道句柄,一个用来输入,一个用来输出准备执行控制台子进程,首先使用GetStartupInfo得到StartupInfo使用第一个管道句柄代替StartupInfo中的hStdInput,第二个代替hStdOutput、hStdError,即标准输入、输出、错误句柄使用CreateProcess执行子进程,这样建立的子进程输入和输出就被定向到管道中父进程通过ReadFile读第二个管道来获得子进程的输出,通过WriteFile写第一个管道来将输入写到子进程父进程可以通过PeekNamedPipe来查询子进程有没有输出子进程结束后,要通过CloseHandle来关闭两个管道。
下面是具体的说明和定义:1.建立匿名管道使用CreatePipe原形如下:BOOL CreatePipe(PHANDLE hReadPipe,//address of variable for read handlePHANDLE hWritePipe,//address of variable for write handleLPSECURITY_ATTRIBUTES lpPipeAttributes,//pointer to security attributesDWORD nSize//number of bytes reserved for pipe);当管道建立后,结构中指向的hReadPipe和hWritePipe可用来读写管道,当然由于匿名管道是单向的,你只能使用其中的一个句柄,参数中的SECURITY_ATTRIBUTES的结构必须填写,定义如下:typedef struct_SECURITY_ATTRIBUTES{DWORD nLength://定义以字节为单位的此结构的长度LPVOID lpSecurityDes criptor;//指向控制这个对象共享的安全描述符,如果为NULL这个对象将被分配一个缺省的安全描述BOOL bInheritHandle;//当一个新过程被创建时,定义其返回是否是继承的.供系统API函数使用. }SECURITY_ATTRIBUTES;2.填写创建子进程用的STARTUPINFO结构,一般我们可以先用GetStartupInfo来填写一个缺省的结构,然后改动我们用得到的地方,它们是:hStdInput--用其中一个管道的hWritePipe代替hStdOutput、hStdError--用另一个管道的hReadPipe代替dwFlags--设置为STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW表示输入输出句柄及wShowWindow字段有效wShowWindow--设置为SW_HIDE,这样子进程执行时不显示窗口。
后台调用外部程序的完美实现(Delphi)
后台调用外部程序的完美实现(Delphi)其基本思路就是)调用CreateProcess()打开目标程序)用FindWindow()找到目标程序的窗口Handle )找到文本框的Handle 以及按钮的MessageID 用SendMessage()方法设置文字并触发事件好了这样确实很简单吧但是当我实现它后却发现这样做的结果则是当我的程序启动并打开目标程序时它的Splash窗口以及主窗口都将显示出来即使当我用FindWindow ()找到主窗口Handle后调用SendMessage(WindowHandle SW_HIDE)来隐藏该窗口还是会有一瞬主窗口被显示出来的这样的效果实在是最求完美的我不忍心看到的那么怎么解决这个问题呢首先我当然在CreateProcess()上面寻找方法可惜它只有一个参数可以设置窗口的默认显示方式但是一旦这个窗口自己重设了显示方式它就没有任何作用了继续查找文档这时我看到CreateProcess()的一个参数TStartupInfo中有 lpDesktop这么一个属性按照MSDN 的说法如果该指针为NULL 那么新建的Process将在当前Desktop上启动而如果对其赋了一个Desktop的名称后Process将在指定的Desktop上启动恩看来不错就从它入手了)首先建立一个虚拟的Desktop const DesktopName = MYDESK ; FDesktop:=CreateDesktop(DesktopName nil nil GENERIC_ALL nil);Windows中可以建立多个Desktop 可以使用SwitchDesktop()来切换哪个Desktop被显示出来以前有过将Windows模拟成Linux的形式可以在多个虚拟Desktop中切换的程序其实那种程序也是用的Windows本身的虚拟Desktop功能来实现的另外 Windows的启动画面以及屏保画面也都是用虚拟Desktop实现的好了关于这方面不多介绍了感兴趣的话可以到MSDN中查看更详细资料sp )在CreateProcess的时候指定程序在我新生成的Desktop上运行var StartInfo:TStartupInfo; FillChar(StartInfo sizeof(StartInfo) );StartInfo cb:=sizeof(StartInfo);StartInfolpDesktop:=PChar(DesktopName); //指定Desktop的名称即可StartInfo wShowWindow:=SW_HIDE;StartInfo dwFlags:=STARTF_USESHOWWINDOW;StartInfo hStdError:= ;StartInfo hStdInput:= ;StartInfo hStdOutput:= ; if not CreateProcess(PChar(FileName) nil nil nil true CREATE_NEW_CONSOLE+HIGH_PRIORITY_CLASS nil PChar(ExtractFilePath(FilePath)) StartInfo FProceInfo) then begin MessageBox(Application Handle Error when init voice ( ) PChar(Application Title) MB_ICONWARNING);exit; end; )用FindWindow去找程序的主窗口开始我直接写下了这样的代码for I:= to do begin //wait seconds for open the main window WindowHandle:=FindWindow(nil WindowCaption ); if WindowHandle<> then begin break; end; Sleep( ); end; 但是实践证明这样是找不到不在当前Desktop中的Window的那怎么办呢答案是可以用SetThreadDesktop()函数这个函数可以设置当前Thread工作所在的Desktop 于是我在以上代码前又加了一句if not SetThreadDesktop(FDesktop) then begin exit;end; 但是程序运行后该函数却返回了false 说明方法调用失败了再仔细看MSDN 发现有这么一句话The SetThreadDesktop function will fail if the calling thread has any windows or hooks on its current desktop (unless the hDesktop parameter is a handle to the current desktop) 原来需要切换Desktop的线程中不能有任何UI方面的东西而我是在程序的主线程中调用该方法的当然会失败拉知道了这点就好办了我只需要用一个干净的线程让它绑定到新的Desktop上再让它用FindWindow()方法找到我要找的WindowHandle 不就可以了吗于是这一步就需要借助一个线程了线程的代码如下TFindWindowThread = class(TThread) private FDesktop:THandle;FWindowHandle:THandle; protected procedure Execute();override;publicconstructor Create(ACreateSuspended:Boolean;const ADesktop:THandle);reintroduce;property WindowHandle:THandle read FWindowHandle;end; { TFindWindowThread } procedure TFindWindowThread Execute(); var I:Integer; begin //make the current thread find window on the new desktop!if not SetThreadDesktop(FDesktop) then begin exit; end; for I:= to do begin //wait seconds for open the main window FWindowHandle:=FindWindow(nil PChar( WindowCaption )); if FWindowHandle<> then begin break; end; Sleep( ); end;end;constructor TFindWindowThread Create(ACreateSuspended:Boolean;const ADesktop:THandle); begin inherited Create(ACreateSuspended); FDesktop:=ADesktop; end; 而主程序中的代码变成这样FindWindowThread:=TFindWindowThread Create(false FDesktop);try FindWindowThread WaitFor; FMainWindowHandle:=FindWindowThread WindowHandle; finally FindWindowThread Free;end;if FMainWindowHandle= then begin MessageBox(Application Handle Error when init voice ( ) PChar(Application Title) MB_ICONWARNING); exit; end; 呵呵成功这样果然可以顺利的找到窗口Handle了)最后再用这个主窗口Handle 找出里面的EditBox的Handle 如这样FEditWindow:=FindWindowEx(FMainWindowHandle PChar( Edit ) nil); 我在这里指定了这个文本框的ClassName 这个名称可以用Spy++得到初始化的工作就到此结束了如果顺利程序就真正在后台被运行了起来那么功能调用呢还是和一般的做法一样if (FMainWindowHandle= ) or (FEditWindow= ) then begin exit;end;SendMessage(FEditWindow WM_SETTEXT LongInt(@AText[ ]));SendMessage(FMainWindowHandleWM_MAND $ $ ); 其中$ 这个数字也是用Spy++来得到的资源ID 最后别忘了关闭程序以及释放虚拟Desktop if FProceInfo hProcess<> then begin TerminateProcess(FProceInfo hProcess );end;if FDesktop<> then begin CloseDesktop(FDesktop); end; lishixinzhi/Article/program/Delphi/201311/8390。
delphi之调用外部dll中的函数
delphi之调用外部dll中的函数分早绑定和晚绑定两种。
早绑定的代码如下:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;//MB 函数的声明:function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;implementation{$R *.dfm}{调用外部DLL 中的函数,譬如调用系统user32.dll 中的MessageBoxA}//function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; // stdcall; external user32 name'MessageBoxA';{其中user32 是Delphi 定义的常量'user32.dll',可以直接写成:}//function MB(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; // stdcall; external 'user32.dll' name 'MessageBoxA';{name 后面说明函数的真实名字}{external 子句说明单元载入时就加载函数,也就是早绑定;如果晚绑定需要用LoadLibrary}{stdcall 指令表示参数传递是从右到左(Pascal则反之),不通过CPU寄存器传递}{4个参数的数据类型可以使用对应的 Delphi 数据类型,譬如:} //function MB(hWnd: LongWord; lpText, lpCaption: PChar; uType: LongWord): Integer;// stdcall; external 'user32.dll' name 'MessageBoxA';{或者是:}//function MB(hWnd: Cardinal; lpText, lpCaption: PChar; uType: Cardinal): Integer;// stdcall; external 'user32.dll' name 'MessageBoxA';{如果函数在此单元声明后,需要给其他单元调用,需要先在interface 区声明:} //function MB(hWnd: Cardinal; lpText, lpCaption: PChar; uType: Cardinal): Integer;// stdcall;{本例已经这样做了,如果要测试其他几种情况,需要先注释掉它} {然后在 implementation 区,说明函数的来源:}function MB; external 'user32.dll' name 'MessageBoxA';//调用测试:procedure TForm1.Button1Click(Sender: TObject);vart,b: PChar;begint := '标题';b := '内容';MB(0,b,t,0);end;end.晚绑定的例子:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;type//晚绑定,也就是动态调用外部函数主要用以下三个命令://LoadLibrary:获取 DLL//GetProcAddress:获取函数//FreeLibrary:释放//定义一个过程类型,参数要和需要的函数一致TMB = function(hWnd: HWND; lpT ext, lpCaption: PChar; uType: UINT): Integer; stdcall;TForm1 = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);procedure FormCreate(Sender: TObject);procedure FormDestroy(Sender: TObject);privateMB: TMB; {声明函数 MB}inst: LongWord; {声明一个变量来记录要使用的 DLL 句柄}public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);begininst := LoadLibrary('user32.dll');if inst <> 0thenMB := GetProcAddress(inst, 'MessageBoxW');// MB := GetProcAddress(inst, 'MessageBoxA'); {Delphi 2009 之前的版本用这句}end;//调用测试:procedure TForm1.Button1Click(Sender: TObject);vart,b: PChar;begint := '标题';b := '内容';MB(0, b, t, 0);end;procedure TForm1.FormDestroy(Sender: TObject);beginFreeLibrary(inst); {记得释放}end;end.创建并调用dll//通过 DLL Wizard 建立:library TestDLL;usesSysUtils,Classes,Dialogs;{$R *.res}//建立过程procedure Test;beginShowMessage('TestDLL.Test');end;//输出exportsTest;beginend.//在其他工程调用,如果不在一个工程组,需要在相同目录下、System32下或指定路径;//声明可以在实现区或接口区,这里的函数名要一致,甚至大小写。
Windows CMD命令调用外部程序的使用方法
Windows CMD命令调用外部程序的使用方法Windows CMD命令是Windows操作系统中的一个命令行工具,它可以通过调用外部程序来完成一些特定的任务。
在本文中,我将介绍一些常用的CMD命令以及如何使用它们来调用外部程序。
一、CMD命令的基本使用方法CMD命令是通过在命令提示符下输入特定的命令来执行的。
下面是一些常用的CMD命令:1. dir:用于列出当前目录下的文件和文件夹。
2. cd:用于切换当前目录。
3. md:用于创建新的文件夹。
4. rd:用于删除指定的文件夹。
5. copy:用于复制文件。
6. del:用于删除文件。
7. move:用于移动文件。
8. ren:用于重命名文件。
通过使用这些基本的CMD命令,我们可以在命令行中完成一些简单的文件和文件夹的操作。
二、调用外部程序的方法除了使用基本的CMD命令,我们还可以通过调用外部程序来完成一些更复杂的任务。
下面是一些调用外部程序的方法:1. 使用绝对路径:可以通过输入外部程序的绝对路径来调用它。
例如,如果你想调用C:\Program Files\Internet Explorer\iexplore.exe这个程序,你可以在CMD命令行中输入该路径来启动Internet Explorer浏览器。
2. 使用环境变量:Windows操作系统提供了一些预定义的环境变量,可以用来表示一些常用的目录和程序路径。
通过使用这些环境变量,我们可以更方便地调用外部程序。
例如,%SystemRoot%表示Windows系统目录,%ProgramFiles%表示程序文件目录。
通过在CMD命令行中输入这些环境变量,我们可以启动系统中的一些常用程序。
3. 添加程序路径到系统环境变量:如果你经常需要调用某个特定的外部程序,你可以将该程序的路径添加到系统的环境变量中。
这样,你就可以在任何位置直接调用该程序了。
要添加程序路径到系统环境变量,你可以按下Win + Pause键打开系统属性对话框,然后点击"高级系统设置",在"高级"选项卡中点击"环境变量"按钮,然后在"系统变量"部分找到"Path"变量,点击"编辑"按钮,然后在变量值中添加程序路径。
如何让Delphi调用外部程序并等待其运行结束
要调用外部程序,可以使用API中的WinExec函数或者ShellExecute函数一下是调用Windows内部一些程序的方法========================你要启动“日期/时间属性”,只要在Button的Click事件中加一句:winexec( 'rundll32.exe shell32.dll,Control_RunDLL timedate.cpl ',9);大功告成。
其它:{启动控制面板}winexec( 'rundll32.exe shell32.dll,Control_RunDLL ',9);{辅助选项属性-键盘}winexec( 'rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1 ',9);{辅助选项属性-声音}winexec( 'rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2 ',9);{辅助选项属性-显示}winexec( 'rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3 ',9);{辅助选项属性-鼠标}winexec( 'rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4 ',9);{辅助选项属性-常规}winexec( 'rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5 ',9);{添加/删除程序属性-安装/卸载}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Appwiz.cpl,,1 ',9);{添加/删除程序属性-Windows安装程序}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Appwiz.cpl,,2 ',9);{添加/删除程序属性-启动盘}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Appwiz.cpl,,3 ',9);{显示属性-背景}winexec( 'rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,0 ',9); {显示属性-屏幕保护程序}winexec( 'rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1 ',9);{显示属性-外观}winexec( 'rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,2 ',9);{显示属性-设置}winexec( 'rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,3 ',9);{Internet 属性-常规}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Inetcpl.cpl,,0 ',9);{Internet 属性-安全}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Inetcpl.cpl,,1 ',9);{Internet 属性-内容}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Inetcpl.cpl,,2 ',9);{Internet 属性-连接}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Inetcpl.cpl,,3 ',9);{Internet 属性-程序}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Inetcpl.cpl,,4 ',9);{Internet 属性-高级}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Inetcpl.cpl,,5 ',9);{区域设置属性-区域设置}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Intl.cpl,,0 ',9);{区域设置属性-数字}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Intl.cpl,,1 ',9);{区域设置属性-货币}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Intl.cpl,,2 ',9);{区域设置属性-时间}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Intl.cpl,,3 ',9);{区域设置属性-日期}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Intl.cpl,,4 ',9);{游戏控制器-一般}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Joy.cpl,,0 ',9);{游戏控制器-高级}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Joy.cpl,,1 ',9);{鼠标属性}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Main.cpl ',9);{多媒体属性-音频}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Mmsys.cpl,,0 ',9);{多媒体属性-视频}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Mmsys.cpl,,1 ',9);{多媒体属性-MIDI}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Mmsys.cpl,,2 ',9);{多媒体属性-CD音乐}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Mmsys.cpl,,3 ',9);{多媒体属性-设备}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Mmsys.cpl,,4 ',9);{调制解调器属性}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Modem.cpl ',9);{网络}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Netcpl.cpl ',9);{密码属性}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Password.cpl ',9);{扫描仪与数字相机属性}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Sticpl.cpl ',9);{系统属性-常规}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Sysdm.cpl,,0 ',9);{系统属性-设备管理器}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Sysdm.cpl,,1 ',9);{系统属性-硬件配置文件}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Sysdm.cpl,,2 ',9);{系统属性-性能}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Sysdm.cpl,,3 ',9);{日期/时间属性}winexec( 'rundll32.exe shell32.dll,Control_RunDLL timedate.cpl ',9);{电源管理属性}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Powercfg.cpl ',9);{拨号属性}winexec( 'rundll32.exe shell32.dll,Control_RunDLL Telephon.cpl ',9);===================================如何让Delphi调用外部程序并等待其运行结束函数一:usesWindows,SysUtils,Classes,ShellAPI;function RunAndWait(FileName: string; Visibility: Integer): THandle;varzAppName: array[0..512] of Char;zCurDir: array[0..255] of Char;WorkDir: string;StartupInfo: TStartupInfo;ProcessInfo: TProcessInformation;begintryStrPCopy(zAppName, FileName);GetDir(0, WorkDir);StrPCopy(zCurDir, WorkDir);FillChar(StartupInfo, SizeOf(StartupInfo), #0);StartupInfo.cb := SizeOf(StartupInfo);StartupInfo.dwFlags := STARTF_USESHOWWINDOW;StartupInfo.wShowWindow := Visibility;if not CreateProcess(nil, zAppName, nil, nil, false, Create_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) thenbeginresult := 0;Exit;endelsebeginWaitForSingleObject(ProcessInfo.hProcess, INFINITE);GetExitCodeProcess(ProcessInfo.hProcess, result);end;finallyend;end;函数二:function WinExecAndWait32(FileName: string; Visibility: Boolean): integer; varzAppName: array[0..512] of char; //存放应用程序名StartupInfo: TStartupInfo;ProcessInfo: TProcessInformation;exitCode: Dword;aVisibility: integer;beginStrPCopy(zAppName, FileName);FillChar(StartupInfo, Sizeof(StartupInfo), #0);//给StartupInfo结构体赋值StartupInfo.cb := Sizeof(StartupInfo);StartupInfo.dwFlags := STARTF_USESHOWWINDOW;if Visibility thenaVisibility := 1elseaVisibility := 0;StartupInfo.wShowWindow := aVisibility;//调用CreateProcess 创建进程,执行指定的可执行文件if not CreateProcess(nil, zAppName, nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) thenResult := -1elsebegin//等待可执行文件退出WaitforSingleObject(ProcessInfo.hProcess, INFINITE);//得到进程终止状态码GetExitCodeProcess(ProcessInfo.hProcess, exitCode);result := Exitcode;end;end;其中参数Visibility 取值如下:行号参数含义1 SW_HIDE 隐藏这个窗体,并激活其他窗体。
Delphi动态与静态调用DLL(最好的资料)
Delphi动态与静态调用DLL(最好的资料)摘要:本文阐述了 Windows 环境下动态链接库的概念和特点,对静态调用和动态调用两种调用方式作出了比较,并给出了 Delphi 中应用动态链接库的实例。
一、动态链接库的概念动态链接库( Dynamic Link Library ,缩写为 DLL )是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。
动态链接库文件的扩展名一般是 dll ,也有可能是 drv 、 sys 和 fon ,它和可执行文件( exe )非常类似,区别在于 DLL 中虽然包含了可执行代码却不能单独执行,而应由 Windows 应用程序直接或间接调用。
动态链接是相对于静态链接而言的。
所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。
换句话说,函数和过程的代码就在程序的 exe 文件中,该文件包含了运行时所需的全部代码。
当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。
而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。
仅当应用程序被装入内存开始运行时,在 Windows 的管理下,才在应用程序与相应的 DLL 之间建立链接关系。
当要执行所调用 DLL 中的函数时,根据链接产生的重定位信息, Windows 才转去执行 DLL 中相应的函数代码。
一般情况下,如果一个应用程序使用了动态链接库, Win32 系统保证内存中只有 DLL 的一份复制品,这是通过内存映射文件实现的。
DLL 首先被调入 Win32 系统的全局堆栈,然后映射到调用这个 DLL 的进程地址空间。
在 Win32 系统中,每个进程拥有自己的 32 位线性地址空间,如果一个 DLL 被多个进程调用,每个进程都会收到该 DLL 的一份映像。
java调用cmd命令
java调⽤cmd命令1.使⽤Runtime中exec(String command)⽅法执⾏cmd命令,如下:Process p = Runtime.getRuntime().exec(cmd);此⽅法会抛出IOException,但是在项⽬中遇到没有出现异常,命令也没有执⾏的情况。
2.此⽅法可以达到⼤多的cmd调⽤的期望结果,但有些时候回出现命令卡死在p.waitFor();上,造成线程阻塞,原因:public static boolean runCMD(String cmd) throws IOException, InterruptedException {final String METHOD_NAME = "runCMD";Process p = Runtime.getRuntime().exec(cmd);BufferedReader br = null;try {br = new BufferedReader(new InputStreamReader(p.getErrorStream()));String readLine = br.readLine();StringBuilder builder = new StringBuilder();while (readLine != null) {readLine = br.readLine();builder.append(readLine);}logger.debug(METHOD_NAME + "#readLine: " + builder.toString());p.waitFor();int i = p.exitValue();(METHOD_NAME + "#exitValue = " + i);if (i == 0) {return true;} else {return false;}} catch (IOException e) {logger.error(METHOD_NAME + "#ErrMsg=" + e.getMessage());e.printStackTrace();throw e;} finally {if (br != null) {br.close();}}}3.使⽤以下⽅法不会出现和2⼀样情况下得阻塞的问题,与2的区别就是获取流不同,将getErrorStream换成getInputStream就好了public static boolean runCMD(String cmd) throws IOException, InterruptedException {final String METHOD_NAME = "runCMD";// Process p = Runtime.getRuntime().exec("cmd.exe /C " + cmd);Process p = Runtime.getRuntime().exec(cmd);BufferedReader br = null;try {// br = new BufferedReader(new InputStreamReader(p.getErrorStream()));br = new BufferedReader(new InputStreamReader(p.getInputStream()));String readLine = br.readLine();StringBuilder builder = new StringBuilder();while (readLine != null) {readLine = br.readLine();builder.append(readLine);}logger.debug(METHOD_NAME + "#readLine: " + builder.toString());p.waitFor();int i = p.exitValue();(METHOD_NAME + "#exitValue = " + i);if (i == 0) {return true;} else {return false;}} catch (IOException e) {logger.error(METHOD_NAME + "#ErrMsg=" + e.getMessage());e.printStackTrace();throw e;} finally {if (br != null) {br.close();}}}4.对于3⽅法有个缺点是执⾏错误时⽆法将错误消息打印出来,还有⼀个⽅法是先将执⾏的cmd命令写⼊到⽂件中后再执⾏,这是如果执⾏错误⽇志可以打印,线程也不会卡死。
python调用cmd命令的方法
python调用cmd命令的方法
1、python的OS模块
OS模块调用CMD命令有两种方式:os.popen()、os.system()都是用当前进程来调用。
OS.system是无法获取返回值的。
当运行结束后接着往下面执行程序。
用法如:OS.system("ipconfig").
OS.popen带返回值的,如何获取返回值。
如:
p=os.popen(cmd)
print p.read().得到的是个字符串。
这两个都是用当前进程来调用,也就是说它们都是阻塞式的。
2、管道subprocess模块
运行原理会在当前进程下面产生子进程。
sub=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)
sub.wait()
print sub.read()
3、commands.getstatusoutput('cmd')
status ,output = commands.getstatusoutput('cmd')
status = commands.getstatus('cmd')
output = commands.getoutput('cmd')
顾名思义,status,output分别是执行的状态和输出结果,但是这种方法在windows中不能用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
>
>delphi调用CMD文件用这个函数
>
>WinExec()函数
>
>例:我要调用'e:\call.cmd这个文件
>
>winExec('e:\call.cmd',SW_HIDE);
>
>SW_SHOW表示以当前大小激活运行后的程序窗口并显示它。
>
>
>正在装载数据……
>
>
>第二个参数是控制程序主窗口的显示方式
>格式一:mailto:?
>如:ShellExecute(handle,‘open’, ‘mailto:’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口。?
>格式二:mailto:用户账号@邮件服务器地址?
●hWnd:用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。例如,可以将其设置为应用程序主窗口句柄,即Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。?
●Operation:用于指定要进行的操作。其中“open”操作表示执行由FileName参数指定的程序,或打开由FileName参数指定的文件或文件夹;“print”操作表示打印由FileName参数指定的文件;“explore”操作表示浏览由FileName参数指定的文件夹。当参数设为nil时,表示执行默认操作“open”。?
>SW_SHOWMINIMIZED //激活窗口并以最小化运行
>SW_SHOWMINNOACTIVE //最小化运行,但不激活
>SW_SHOWNOACTIVATE //以上一次的窗口大小运行,但不激活
>SW_SHOWNORMAL //普通方式,一般运行时采用这个?有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。CreateProcess因为andle,nil,'cmd.exe',pchar(form2.edit1.text),nil,sw_hide);
WinExec主要运行EXE文件。如:WinExec(’Notepad.exe Readme.txt’, SW_SHOW);?
ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。
>格式一:http://网站域名。?
>如:ShellExecute(handle, ‘open’, http:// ;?’, nil, nil, SW_SHOWNORMAL);?
>格式二:http://网站域名/网页文件名。?
>如:ShellExecute(handle, ‘open’, http:// ;?/default.htm’,nil,nil,?SW_SHOWNORMAL);?
如果将FileName参数设置为“mailto:”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括Microsoft Outlook Exdivss)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据Windows 9x/NT注册表中mailto协议处理程序的设置确定启动哪个邮件客户程序。?
格式一:http://网站域名。?
如:ShellExecute(handle, ‘open’, http:// ;?’, nil, nil, SW_SHOWNORMAL);?
格式二:http://网站域名/网页文件名。?
如:ShellExecute(handle, ‘open’, http:// ;?/default.htm’,nil,nil,?SW_SHOWNORMAL);?
首先必须引用shellapi.pas单元:uses ShellAPI;?
1.标准用法?
ShellExecute函数原型及参数含义如下:?
function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;?
>如果将FileName参数设置为“mailto:”协议格式,那么该函数将启动默认邮件客户程序,如Microsoft Outlook(也包括Microsoft Outlook Exdivss)或Netscape Messanger。若用户机器中安装了多个邮件客户程序,则该函数将根据Windows 9x/NT注册表中mailto协议处理程序的设置确定启动哪个邮件客户程序。?
格式三:mailto:用户账号@邮件服务器地址?subject=邮件主题&body=邮件正文?
如:ShellExecute(handle, ‘open’, ‘ mailto:who@?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址、邮件主题和邮件正文。若邮件正文包括多行文本,则必须在每行文本之间加入换行转义字符%0a。?
>ShellExecute函数原型及参数含义如下:?
>function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;?
>●hWnd:用于指定父窗口句柄。当函数调用过程出现错误时,它将作为Windows消息窗口的父窗口。例如,可以将其设置为应用程序主窗口句柄,即Application.Handle,也可以将其设置为桌面窗口句柄(用GetDesktopWindow函数获得)。?
●FileName:用于指定要打开的文件名、要执行的程序文件名或要浏览的文件夹名。?
●Parameters:若FileName参数是一个可执行程序,则此参数指定命令行参数,否则此参数应为nil或PChar(0)。?
●Directory:用于指定默认目录。?
●ShowCmd:若FileName参数是一个可执行程序,则此参数指定程序窗口的初始显示方式,否则此参数应设置为0。?
格式一:mailto:?
如:ShellExecute(handle,‘open’, ‘mailto:’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口。?
格式二:mailto:用户账号@邮件服务器地址?
如:ShellExecute(handle, ‘open’,‘ mailto:who@’, nil, nil, SW_SHOWNORMAL);打开新邮件窗口,并自动填入收件人地址。若指定多个收件人地址,则收件人地址之间必须用分号或逗号分隔开(下同)。?
delphi调用cmd的两种方法2008年10月01日 星期三 12:221
var
s:string;
begin
s:='cmd.exe /c '+edit1.Text+' >c:\1.txt';
winexec(pchar(s),sw_hide);
sleep(2000);
memo1.Lines.LoadFromFile('c:\1.txt');
>若ShellExecute函数调用成功,则返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。?
>上述仅仅是ShellExecute函数的标准用法,下面将介绍它的特殊用法。?
>
>2.特殊用法?
>如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。?
若ShellExecute函数调用成功,则返回值为被执行程序的实例句柄。若返回值小于32,则表示出现错误。?
上述仅仅是ShellExecute函数的标准用法,下面将介绍它的特殊用法。?
2.特殊用法?
如果将FileName参数设置为“http:”协议格式,那么该函数将打开默认浏览器并链接到指定的URL地址。若用户机器中安装了多个浏览器,则该函数将根据Windows 9x/NT注册表中http协议处理程序(Protocols Handler)的设置确定启动哪个浏览器。?
>
>WinExec主要运行EXE文件。如:WinExec(’Notepad.exe Readme.txt’, SW_SHOW);?
>ShellExecute不仅可以运行EXE文件,也可以运行已经关联的文件。
>首先必须引用shellapi.pas单元:uses ShellAPI;?
>
>1.标准用法?
>第二个参数可能的取值为 :
>SW_HIDE //程序启动后隐藏主窗口
>SW_MAXIMIZE //最大化运行