从ShellExecuteEx()

时间:2017-09-08 03:45:30

标签: c++ postgresql pg-dump shellexecuteex

当我尝试使用ShellExecuteEx()执行pg_dump.exe时,它返回退出代码1(失败),我想我可能对我所犯的一个简单错误视而不见。

以下是在命令提示符下运行的命令行:

"C:\Program Files\PostgreSQL\9.6\bin\pg_dump.exe" --host=localhost --port=5432 --username=journaluser Journal > "C:\Google Drive\Journal\Journal20170907203244973.backup"

使用正确的内容创建备份文件。

以下是SHELLEXECUTEINFO结构的内容:

SHELLEXECUTEINFO see = { 0 };
see.cbSize = sizeof(SHELLEXECUTEINFO);
see.fMask = SEE_MASK_NOCLOSEPROCESS;
see.hwnd = NULL;
see.lpVerb = L"open";
see.lpFile = L"C:\\Program Files\\PostgreSQL\\9.6\\bin\\pg_dump.exe";
see.lpParameters = L" --host=localhost --port=5432 --username=journaluser Journal > \"\"\"C:\\Google Drive\\Journal\\Journal20170907203244973.backup\"\"\"";
see.lpDirectory = NULL;
see.nShow = SW_SHOWNORMAL;
see.hInstApp = NULL;

lpParameters中的额外引号是因为Microsoft在https://msdn.microsoft.com/en-us/library/windows/desktop/bb759784(v=vs.85).aspx处说:“要在lpParameters中包含双引号,请将每个标记括在一对引号中,如下例所示......”< / p>

ShellExecuteEx()调用成功,但退出代码为1,并且不会创建.backup文件。

我尝试过使用和不使用引号的各种形式的调用,我尝试过CreateProcess(),但结果是一样的 - 退出代码1而没有备份文件。

我也尝试使用Cmd.exe作为程序,以“/ K(etc)”作为参数,但是没有用。

我错过了一些简单的事情吗?

感谢。

9/8编辑:我忘了提到SetEnvironmentVariable()用于在调用ShellExecuteEx()之前设置PGPASSWORD。在测试期间,我使用GetEnvironmentVariable()来确保值存在。

编辑2:我会尝试Artemy的建议。与此同时,我根据https://www.postgresql.org/docs/current/static/libpq-pgpass.html创建了一个密码文件,但没有任何区别。 (为清楚起见,我在lpParameters上添加了缺少的“L”。)

编辑3:正如Artemy建议的那样,我编写了一个代替pg_dump的程序。它只是将pg_dump通常会接收的命令行参数写入文件并退出。以下是结果(没有惊喜;备份文件名称不同,因为它是从日期和时间动态创建的):

0: C:\dev\Applications\ParamTest\x64\Release\ParamTest.exe
1: --host=localhost
2: --port=5432
3: --username=journaluser
4: Journal
5: >
6: C:\Google Drive\Journal\Journal20170908093402258.backup
7: Environment password is 'qr71psgk'

也许结果0行(程序名称)是导致pg_dump失败的原因,如果它被传递给pg_dump。我会跟踪它。

编辑4:我通过创建一个接受参数并调用pg_dump的批处理文件解决了这个问题。这有效,但我仍然想知道另一种方法出了什么问题。

0 个答案:

没有答案