- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我目前正在尝试使用 CreateProcess() API 启动一个进程: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx
我遇到的主要问题是子进程似乎是在父进程的工作目录下启动的,不管 lpCurrentDirectory 参数中指示的是什么.
提供更多细节:lpCurrentDirectory 似乎适用于简单的命令行程序,但对于更复杂的程序(想想 GUI),它似乎没有被考虑在内,因为所有资源依赖项都是从调用目录进程中搜索的。
我可以尝试来回切换调用进程的工作目录,但第二个问题是被调用进程不在目标目录中。目前,它位于与调用进程相同的目录中,尽管将来可能会发生变化。当我试图调用与父进程位于不同目录中的子进程时,由于某种原因,它失败了。我已经多次检查目录结构,到目前为止没有结果。
我一直在四处寻找(包括 S.O.),虽然有些人似乎提示同样的问题,但我目前还没有找到可用的解决方法。请注意,例如,我不能改用 ShellExec,它必须是 CreateProcess()。
以防万一,我当前的测试系统是 Windows Seven 64 位。该软件应该可以在更广泛的操作系统上运行,从 XP 到 7、32 和 64 位(我猜 W8 目前不在范围内)。
[编辑] 我已经找到了在调用进程工作目录之外调用子进程的解决方案。我为此使用了 lpApplicationName,这很好,但显然不需要引用,即使是包含空格字符的复杂名称也是如此。
这让我可以测试修改调用进程的工作目录的想法(使用 SetCurrentDirectory() )在调用 CreateProcess() 之前。令我惊讶的是,它不起作用:工作目录实际上是在 lpApplicationName 的完整路径中指定的目录,无论通过 SetCurrentDirectory() 为父工作目录设置了什么(并使用 GetCurrentDirectory() 验证)
这对我来说是个问题,因为我希望进程运行到另一个选定的目录(都在 lpCurrentDirectory 参数中指定,并在 CreateProcess() 之前调用 SetCurrentDirectory())。
最佳答案
我相信你的问题是你假设子进程应该尝试从当前目录加载它的资源(如你第三段中所建议的那样),而实际上一个进程从加载它的资源更为常见它从中启动的目录。换句话说,您所描述的行为在大多数情况下都符合预期。
当应用程序通过双击文档或使用拖放操作启动时,当前目录被设置为包含文档的目录,因此如果应用程序从当前目录加载资源,它会'工作。
这个简单的测试应用程序演示了 lpCurrentDirectory
的工作原理,因为子进程的当前目录设置为指定的目录:
#include <Windows.h>
void showcd(wchar_t * caption)
{
wchar_t buffer[512];
if (GetCurrentDirectory(512, buffer) == 0)
{
DWORD err = GetLastError();
MessageBox(NULL, L"GetCurrentDirectory failed", caption, MB_OK);
ExitProcess(err);
}
buffer[511] = L'\0';
MessageBox(NULL, buffer, caption, MB_OK);
}
void parent(wchar_t * cd)
{
wchar_t cmd[512];
STARTUPINFO sinfo;
PROCESS_INFORMATION pinfo;
GetStartupInfo(&sinfo);
showcd(L"Parent Process");
if (GetModuleFileName(NULL, cmd, 512) == 0)
{
MessageBox(NULL, L"GetModuleFileName failed", L"Parent Process", MB_OK);
ExitProcess(GetLastError());
}
cmd[511] = L'\0';
if (!CreateProcess(
cmd, NULL, NULL, NULL, FALSE, 0, NULL, cd, &sinfo, &pinfo
))
{
DWORD err = GetLastError();
MessageBox(NULL, L"CreateProcess failed", L"Oops", MB_OK);
ExitProcess(err);
}
}
int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
)
{
wchar_t * cmdline;
for (cmdline = GetCommandLine(); *cmdline; cmdline++)
{
if (*cmdline == L'*')
{
parent(cmdline + 1);
return 0;
}
}
showcd(L"Child Process");
return 0;
}
要测试应用程序,请使用如下命令行运行它:
currentdirectorytest *c:\Users\Public
来自父进程的第一个对话框显示了父进程的当前目录。第二个对话框来自子进程,显示子进程当前目录,应该是命令行中给出的目录。 (注意指定的目录必须存在,否则创建子进程会失败。)
关于CreateProcess() 似乎不受 lpCurrentDirectory 的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17395385/
谁能帮我解决这个问题?我有一个 Tomcat 和简单的 JSF 应用程序:https://github.com/gooamoko/jsfbilling/ .当我在 Tomcat 上运行应用程序时,它运
我有两个这样的域类,第一个是 Manager : package com.mnm class Manager { String name; static hasMany = [ pro
当我运行以下代码时,打印输出似乎不正确。 void thread_Calc(int *pos) { printf("recieved %d\n", *pos); sig = -1; man
这个问题在这里已经有了答案: How to access a local variable from a different function using pointers? (10 个答案) 关闭
我编写了一个程序,其中列表构建器方法返回 IEnumerable of string,其中包括大量字符串(100 万个项目),我将其存储在 List of string 中,然后它将所有项目附加到 中
我正在尝试编写一个 IRC 类型的聊天客户端,它具有可以连接到服务器的客户端。我试图让它在本地 atm 上工作(使用 FIFOS 而不是套接字)。 我遇到了以下我似乎无法解决的问题: 接受新的客户端连
我的一个 cronjobs 每天发送一封电子邮件 35 6 * * * cd $EZPUBLISHROOT && $PHP runcronjobs.php -q 2>&1 我停止使用 cron sud
我使用 WPF 打印路径来处理在我们的应用程序中创建的大型图表。整个图表由视觉效果组成。 所谓的“DesignerPaginator”对图表进行分页(非常简单)。 从这一点来说,我做了以下三件事: -
我尝试在更新之前跟踪系统应用程序并使用: public static boolean isSystemApplication(Context ctx, IContent content) {
我在这里附上了一个查询分析结果,https://explain.depesz.com/s/x9BN 这是查询 EXPLAIN ANALYZE SELECT branche
我正在做一个 CXF(spring) 项目 (HUB)。部署后,我可以看到肥皂和休息服务列表,我通过两个地址打开它。一种是使用本地主机,第二种是使用我电脑的 ip。所以我得到了这些输出。 使用本地主机
这是一个 AnyHashable 不支持枚举转换的简单案例。 enum testEnum: String { case Test } let myObject: AnyHashable = t
我的主要目标是比较存储在数据库和 XLSX 文件中的数据。 为此,我按以下方式创建了两个列表: private class ProductList { public string produc
我从 CMake 3.6 更新到任何最新版本 (3.12.0-rc2),现在我的一个程序无法编译。 奇怪的是,错误消息显示了标准库本身中的 undefined symbol 。这是错误消息: Unde
我希望将我的自定义对话框动画化为从特定点出现,但我无法为对话框设置动画。 该对话框是一个基本的 RelativeLayout,设置为 extends Dialog 类中的布局。 正如这里的一些答案所建
我已经在这个论坛上调查过很多类似的问题,但似乎没有一个能解决我的问题。 我会在底部列出我在这个论坛上看到的一些问题页面,但让我先谈谈我对这个问题的看法。 我正在使用 codeigniter v 2.x
我正在尝试在 RHEL 7 上启动一个 docker-compose 项目作为 systemd 服务。这是我的 systemd 脚本 (/etc/systemd/system/wp.service):
这个问题已经有答案了: "Notice: Undefined variable", "Notice: Undefined index", "Warning: Undefined array key",
我正在尝试在 RHEL 7 上启动一个 docker-compose 项目作为 systemd 服务。这是我的 systemd 脚本 (/etc/systemd/system/wp.service):
此问题出现在my last question here之后。我想将每个按钮聚焦和失去焦点背景设置为主菜单(ContentPane 即 JPanel)下方的背景颜色,因此按钮看起来像选项卡。它在不同的环
我是一名优秀的程序员,十分优秀!