如何在 Delphi Prism 中调用函数 CreateProcess?

Posted

技术标签:

【中文标题】如何在 Delphi Prism 中调用函数 CreateProcess?【英文标题】:How to call function CreateProcess in Delphi Prism? 【发布时间】:2010-04-25 14:22:45 【问题描述】:

我写的

function CreateProcess(
            lpApplicationName:String;
            lpCommandLine:String;
            lpProcessAttributes:IntPtr;
            lpThreadAttributes:IntPtr;
            bInheritHandles:Boolean;
            dwCreationFlags:Int32;
            lpEnvironment:IntPtr;
            lpCurrentDirectory:IntPtr;
            lpStartupInfo:STARTUPINFO;
            lpProcessInformation:ProcessInfo):Boolean;
         external 'kernel32.dll';

但 VStudio 说“分号”预期 - 在外部和“预期结束”在 'kernel32.dll' 之后; 你能帮我加载和调用一个函数吗?

【问题讨论】:

【参考方案1】:

为什么不使用 .NET Process Class .. 在这种情况下使用互操作没有多大意义,因为您已经在使用 Delphi Prism..

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx

【讨论】:

+1; .NET 的重点不是学习一门编程语言,而是学习.NET Framework 中的内容并加以利用。 .NET 框架非常庞大:en.wikipedia.org/wiki/.NET_Framework【参考方案2】:

@Ilya,您在调用外部函数时使用了错误的语法。您需要使用 DllImport 关键字才能使 Windows 互操作正常工作。

你必须将你的函数重写为

[DllImport("kernel32.dll")]
class function CreateProcess(
            lpApplicationName:String;
            lpCommandLine:String;
            lpProcessAttributes:IntPtr;
            lpThreadAttributes:IntPtr;
            bInheritHandles:Boolean;
            dwCreationFlags:Int32;
            lpEnvironment:IntPtr;
            lpCurrentDirectory:IntPtr;
            lpStartupInfo:STARTUPINFO;
            lpProcessInformation:ProcessInfo):Boolean; external;

检查这个工作示例

namespace ConsoleApplication20;

interface
uses
    System.Diagnostics,
    System.Runtime.InteropServices;


type
PROCESS_INFORMATION =record
    hProcess    : IntPtr;
    hThread     : IntPtr;
    dwProcessId : UInt32;
    dwThreadId  : UInt32;
end;



STARTUPINFO =record
     cb       : UInt32;
    lpReserved: String;
    lpDesktop : String;
    lpTitle   : String;
    dwX       : UInt32;
    dwY       : UInt32;
    dwXSize   : UInt32;
    dYSize    : UInt32;
    dwXCountChars   : UInt32;
    dwYCountChars   : UInt32;
    dwFillAttribute : UInt32;
    dwFlags         : UInt32;
    wShowWindow : ShortInt;
    cbReserved2 : ShortInt;
    lpReserved2 : IntPtr;
    hStdInput   : IntPtr;
    hStdOutput  : IntPtr;
    hStdError   : IntPtr;
end;

  ConsoleApp = class
  private
    [DllImport("kernel32.dll")]
    class method CreateProcess( lpApplicationName: string;  lpCommandLine:string;  lpProcessAttributes:IntPtr; lpThreadAttributes:IntPtr;
                        bInheritHandles:Boolean;dwCreationFlags: UInt32;  lpEnvironment:IntPtr;
                        lpCurrentDirectory:string;var lpStartupInfo:STARTUPINFO;out lpProcessInformation:PROCESS_INFORMATION) : boolean; external;
  public
    class method Main;
  end;

implementation

class method ConsoleApp.Main;
var
lpStartupInfo        : STARTUPINFO;
lpProcessInformation : PROCESS_INFORMATION;
begin
        lpStartupInfo := new STARTUPINFO();
        lpProcessInformation := new PROCESS_INFORMATION();
        Console.WriteLine('Creating Process');
        CreateProcess('C:\WINDOWS\SYSTEM32\notepad.exe', nil, IntPtr.Zero, IntPtr.Zero, false, 0, IntPtr.Zero, nil, var lpStartupInfo, out lpProcessInformation);
        Console.ReadLine();
end;

end.

查看论文链接了解更多信息

Platform Invoke Tutorial A Closer Look at Platform Invoke

【讨论】:

以上是关于如何在 Delphi Prism 中调用函数 CreateProcess?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi Prism 中的操作系统指令

Delphi Prism 的图形或画布属性的替换

如何从 Delphi 调用 Oracle 函数?

如何在 Visual C++ 中使用 Delphi 的寄存器调用约定调用函数?

delphi如何调用DLL

JS如何调用delphi制作的ocx控件中的函数