【问题标题】:Can an application be used to behave like a function?应用程序可以像函数一样使用吗?
【发布时间】:2015-08-26 12:59:05
【问题描述】:

我是一个初学者,所以我会尽量说清楚。我想知道是否可以运行自定义应用程序并让它返回并将结果存储在布尔值、整数或字符串中另一个应用程序(调用它的应用程序)?基本上我希望它表现得像一个返回值的函数,但是另一个调用它的程序。我想在 VB.net 中进行。在使用 boolean 时是这样的:

 a = Process.Start("C:\path_to\myapp.exe")
 if (a) then 
    'execute
 end if

【问题讨论】:

  • 如果可执行文件向标准输出写入任何内容,那么执行它的代码可以读取该输出并解析它以获得您需要的信息。 (尽管它会比您在此处提出的更复杂。)但是如果您要调用的代码位于您的代码可以引用的类库中,而不是试图从命令行抓取输出。

标签: vb.net interprocess inter-process-communicat


【解决方案1】:

在最简单的层面上,不,流程机制的设计本身并不能提供按照您的建议进行操作的能力。您可以获得的最接近的结果是被调用的进程以特定的返回值退出,但这需要使用特定的 API (GetExitCodeProcess) - 而不是您在此处说明的 Start 方法的返回。

您可以执行诸如捕获新进程的输出之类的操作,这不是一个非常可靠的解决方案,或者创建一个临时文件,其中包含“调用”进程可以读取的值,这甚至更不可靠。另一个极端是研究进程间通信的特定技术。

如果您可以稍微扩展您的问题,可以提供一组更具体的可能解决方案。如果您感兴趣的值是由库或某些共享代码生成的,那么这可能会提供更合适的返回机制。

【讨论】:

  • 好的,我想做的是制作一个指纹匹配应用程序。一旦它得到正确的匹配,我希望它把它作为输入发送到另一个应用程序。问题是我只有权通过代码更改后一个应用程序中的某些内容。我无权访问它的任何受保护方法或内置类等。我所能做的几乎就是创建新的潜艇(我没有尝试过类)。我的计划是,一旦用户按下应用程序中的按钮,它将启动指纹应用程序以检查指纹,因此当它找到匹配项时,它将通知第一个应用程序用户可以继续。
  • 您在那里描述的内容涉及一些相当复杂的进程间通信 - 例如,进程 1 向进程 2 发送数据,等待,进程 2 做某事,然后告诉进程 1 继续,例如。这正是您在单个应用程序中可以看到的行为,但是在不同进程之间编排这种行为——其中一个进程在代码访问或更改方面是封闭的——将非常困难。不是不可能,只是很难。听起来您确实需要一个共享的身份验证库,以供不同的应用使用...
  • 嗯好的,谢谢。你能指出我正确的方向吗?我尝试在网上搜索,但找不到我想要的。一开始我考虑过你之前所说的关于为指纹应用程序创建一个要写入的临时文件和第二个要读取的应用程序的内容,但就像你说的那样它并不强大,而且我不会学到任何新东西,因为这很容易。跨度>
  • 好吧,如果是我,并且我有你通常勾勒出来的任务,我会为你可以从指纹系统中利用的任何类型的库或发布的 API 寻找漫长而艰难的您正在编写的应用程序 - 想法是消除对您没有或只有很少控制权的应用程序的依赖。使用这些库来执行指纹验证/身份验证。如果不存在类似的东西,您可以查看 IPC 通道(在这种情况下这似乎有点矫枉过正)。
  • 我通过谷歌搜索“进程间通信”发现了一些与 IPC 通道相关的东西,为什么它会是一个矫枉过正的问题?它会中断或减慢调用指纹应用程序的应用程序控制的进程吗?
【解决方案2】:

这是一个 ConsoleApplication 的例子:

Imports System.IO

Module Main

    Sub Main()
        Dim Output As Boolean = File.Exists(My.Computer.FileSystem.SpecialDirectories.Desktop & "\file.txt")
        Console.WriteLine(Output)
    End Sub

End Module

以及如何读取上一个控制台应用程序的输出(stdout)(这个函数返回一个Boolean):

Public Function GetOutput(executable As String) As Boolean
    Using p As New Process With {.StartInfo = New ProcessStartInfo With {
            .CreateNoWindow = True,
            .FileName = executable,
            .RedirectStandardOutput = True,
            .WindowStyle = ProcessWindowStyle.Hidden,
            .UseShellExecute = False}}
        p.Start()

        Dim output As String = p.StandardOutput.ReadToEnd()
        p.WaitForExit()
        Return CBool(output.Trim)
    End Using
End Function

你现在可以用这个来做你想做的事了:

a = GetOutput("C:\path_to\myapp.exe")
If a Then
    'execute
End If

另请参阅(在 C# 中):How to make a Main Method of a console based application to return a string type

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    相关资源
    最近更新 更多