我正在尝试使用以下代码从C++应用程序启动Java应用程序:
#include <windows.h>
#include <memory.h>
#include <tchar.h>
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
STARTUPINFOW siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
if (CreateProcess(TEXT("c:\\java\\jre\\bin\\java.exe"), TEXT("-jar testapp.jar"), NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &siStartupInfo, &piProcessInfo) == false) {
MessageBox(NULL, L"Could not load app", L"Error", 0);
}
CloseHandle(piProcessInfo.hProcess);
CloseHandle(piProcessInfo.hThread);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我构建并运行该程序时,我收到以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: testapp/jar
Caused by: java.lang.ClassNotFoundException: testapp.jar
at: java.net.URLClassLoader$1.run(Uknown Source)
at: java.security.AccessController.doPrivileged(Native Method)
at: java.net.URLClassLoader.findClass(Uknown Source)
at: java.lang.ClassLoader.loadClass(Uknown Source)
at: …Run Code Online (Sandbox Code Playgroud) 您好我不是win32程序员,它对我来说都是新的.我想从我的父win32应用程序打开进程(确定这是我知道怎么做)子进程然后写入文本文件并自行关闭它.如何在父应用程序中检测到子应用程序完成了对文本文件的写入.然后从父应用程序中读取文本文件.这一切都在win32 c ++中谢谢
背景信息: Windows 7,Visual C++ 2010 Express
问题: CreateProcess()通过'无效的命令行参数'继续返回
说明:我正在编写一段使用Windows API的CreateProcess调用外部程序的代码.到目前为止,我已接到使用一个外部程序的电话:
if( !CreateProcess( "C:\\Temp\\convert.exe",
t_str, // Arguments
...
}
//where t_str is " C:\\img1.jpeg C:\\img1.pgm" (ImageMagick if you're wondering).
Run Code Online (Sandbox Code Playgroud)
即使我将所有数据都推送到Windows字符串和指针中,我也可以完美地工作.所以我复制了CreateProcess()的所有修改,以便对另一个外部程序进行另一次调用:
if( !CreateProcess( "C:\\Temp\\sift.exe",
t_str2, // Arguments
...
}
//where t_str2 is ` < C:\\img1.pgm > C:\\img1.key`
Run Code Online (Sandbox Code Playgroud)
基本上,一些非常相似,但所有变量名称都已更改(因为我有两个调用运行串行).这就是问题所在; 这不会运行,而是打印出"无效的命令行参数:<C:\ img1.pgm".当然,这个命令在命令提示符下工作正常,但在我的代码中没有.
我将t_str2切换到其他一些不太复杂的东西(因为我知道sift.exe如何工作),我得到了相同的结果.当我只进行筛选而不是转换时,会发生同样的事情.
问题:可能导致此问题的原因是什么?我该怎么做才能进一步调试这个问题?关于我正在使用的方法的替代方案的任何建议?任何帮助表示赞赏.我可以提供进一步的代码,但它非常直接,并没有太多可能出错.
我有以下测试代码:
#define CMDLINE ".\\dummyFolder\\dummyProc.exe op1 op2 op3"
int main(int argc, char **argv) {
STARTUPINFO info;
info.cb = sizeof(STARTUPINFO);
info.lpReserved = NULL;
info.cbReserved2 = 0;
info.lpReserved2 = NULL;
PROCESS_INFORMATION processInfo;
SECURITY_ATTRIBUTES procAttr;
procAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
procAttr.lpSecurityDescriptor = NULL;
procAttr.bInheritHandle = false;
SECURITY_ATTRIBUTES threadAttr;
procAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
procAttr.lpSecurityDescriptor = NULL;
procAttr.bInheritHandle = false;
bool handlersInheritable = true;
char cmdLine2[sizeof(CMDLINE)];
strcpy(cmdLine2, CMDLINE);
char AppName[sizeof(".\\dummyFolder\\dummyProc.exe")];
strcpy(AppName, ".\\dummyFolder\\dummyProc.exe");
if (CreateProcess(AppName, cmdLine2, &procAttr, &threadAttr,
handlersInheritable, 0, NULL, NULL, &info, &processInfo)) {
//::WaitForMultipleObjects(procQty, handlers, waitForAll, waitInterval);
CloseHandle(processInfo.hProcess); …Run Code Online (Sandbox Code Playgroud) 我试图使用delphi将命令发送到命令提示符.但是,我无法这样做,因为我使用CreateProcess方法来做到这一点.我试图更改StdOutPipeWrite,但是,在CreateProcess的初始命令传递之后,CreateProcess似乎不允许命令.有没有办法利用句柄继续发送和接收来往命令提示符和delphi的命令和消息?
我正在尝试编写小型调试器.我的简化代码是
STARTUPINFOA sui;
ZeroMemory( &sui, sizeof(sui) );
sui.cb = sizeof(sui);
PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(pi) );
DWORD dwFlags = DEBUG_PROCESS;
string program = "program.exe";
if (! CreateProcessA(NULL, (char*) program.c_str(), NULL, NULL, TRUE, dwFlags, NULL, NULL, &sui, &pi))
printf("%s failed. LastError = %d", program.c_str(), GetLastError());
Run Code Online (Sandbox Code Playgroud)
在大量的可执行文件上它工作正常.
但是例如在C#编译的可执行文件上,这段代码输出"program.exe failed.LastError = 50".错误50是ERROR_NOT_SUPPORTED(http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382 (v=vs.85 ) .aspx).这可能是什么原因?我如何调试所有类型的二进制文件?
我目前潜入的Win32 API,写我自己的包装类CreateProcess和CreatePipe。我只是想知道如果我打开的进程为管道缓冲区写入过多的输出会发生什么。该过程会等到我从管道的另一端读取吗?该CreatePipe函数的备注表明:
当进程使用 WriteFile 写入匿名管道时,直到写入所有字节后,写入操作才会完成。如果在写入所有字节之前管道缓冲区已满,则 WriteFile 不会返回,直到另一个进程或线程使用 ReadFile 来提供更多可用缓冲区空间。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa365152%28v=vs.85%29.aspx
让我们假设我打开一个进程CreateProcess,然后使用WaitForSingleObject等待进程退出。如果进程超过其标准输出管道的缓冲区大小,它会退出吗?
我确定大多数Windows开发人员通常在尝试混合32位和64位可执行文件时都熟悉此错误消息。特别是Python和Java都可以得到它。
显然,它%1代表失败命令的第一个参数-即尝试加载的可执行文件-但是为什么不使用实际路径填充它呢?
是调用者做错了什么,还是某些Windows子系统的基本故障,由于兼容性原因而无法修复?
我需要创建一个变量来使用CreateProcess:
CreateProcess(z7Cmdline, z7Arg, NULL, NULL, FALSE, NULL, NULL, NULL, &startInfo, &processInfo);
Run Code Online (Sandbox Code Playgroud)
变量z7Arg是7 -zip的参数列表,其中包含基于当前日期的文件名,即:2017-12-13.zip.
string buArg = "-o""c:\\moshe"" a " + buDir + buFileName + "c:\\moshe\\*.pdf";
Run Code Online (Sandbox Code Playgroud)
我想将buArg复制到z7Arg作为LPTSTR,以便在CreateProcess例程中使用
我该怎么办呢?
我是C++编码的新手,30年前我使用IBM Fortran和汇编语言为Grumman Aerospace编写程序,但从那以后我做了很少的编码.
我正在 Windows 内部进行一些探索以进行一般性教育,并且我正在尝试了解 Image File Execution Options 背后的机制。具体来说,我为 calc.exe 设置了一个调试器条目,"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -NoExit -Command "& { start-process -filepath $args[0] -argumentlist $args[1..($args.Length - 1)] -nonewwindow -wait}"作为有效负载。这导致递归,启动了许多 powershell 实例,考虑到我正在拦截他们对calc.exe.
不过,这就引出了一个问题:普通调试器如何在不引起这种递归行为的情况下启动被测程序?