【问题标题】:Appending Strings to lpCmdLine WinMain将字符串附加到 lpCmdLine WinMain
【发布时间】:2014-02-28 15:11:50
【问题描述】:

尝试为可执行文件创建加载程序,但当参数中提供的字符串长度超过某个长度时,它无法执行。但是参数完全是从初始化文件中读取的。当Parameters=Null 时它也会崩溃。

typedef int (__cdecl *ExecMain_t)(HINSTANCE, HINSTANCE, LPSTR, int);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
HMODULE Loader = LoadLibraryExA(".\\library.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);

char* Parameters;
CIniFile iniReader(".\\Configure.ini");
Parameters = iniReader.IniReadValue("App", "Parameters");

char xCommand[MAX_PATH] = {0};
_snprintf_s(xCommand, _TRUNCATE, "-verify "); //parameter from exe
strcat_s(xCommand, _TRUNCATE, Parameters);
strcpy_s(lpCmdLine, _TRUNCATE, xCommand);

delete[] Parameters;
Parameters = NULL;

ExecMain_t procExecMain = (ExecMain_t)GetProcAddress(Loader,"ExecMain");
procExecMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);

return 1;
}

崩溃描述:

问题事件名称:APPCRASH 应用程序名称:exec.exe 应用程序版本:0.0.0.0 申请时间戳:530df50a 故障模块名称:KERNELBASE.dll 故障模块版本:6.2.9200.16384

编辑:试图弄清楚为什么当参数字符串长度增加时它会崩溃。

如果我将更多字符与“-verify”(从 exe 传递参数)一起传递,甚至会崩溃

EDIT2:通过将 MAX_PATH 替换为 _TRUNCATE 来修改代码。似乎对参数中的某些字符有效,但超过时会崩溃。

【问题讨论】:

  • 请发帖SSCCE。您当前的代码 sn-p 中没有任何内容可以完全解释您遇到的错误。
  • strcpy进入WinMainlpCmdLine 听起来是个坏主意。
  • 有什么解决方法吗?既然我已经提到过,它适用于较小的字符串,适用于较大的字符串或无字符串(Null)
  • 只需放弃strcpy_s 呼叫,并将xCommand 直接传递给procExecMain
  • @IgorTandetnik 参数被读取,但似乎被可执行文件忽略(甚至“-verify”)。我尝试将 char* 转换为 char(strncpy) 但没有运气。 PS:lpCmdLine 是 LPSTR。

标签: c++ visual-c++


【解决方案1】:

这里有几个问题:

char xCommand[MAX_PATH] = {0};
_snprintf_s(xCommand, _TRUNCATE, "-verify "); //parameter from exe
strcat_s(xCommand, _TRUNCATE, Parameters);
strcpy_s(lpCmdLine, _TRUNCATE, xCommand);

我认为你应该使用strcpy_s 而不是_snprintf_s,毕竟我没有看到你在xCommand 中打印任何格式。

那么,第二个参数_TRUNCATE实际上应该是MAX_PATH,因为这个函数的第二个参数是目标缓冲区的元素数。

但最重要的是,第三行完全错误,因为您试图写入输入缓冲区lpCmdLine,这将覆盖缓冲区边界之外的内存。您需要将原始缓冲区的内容复制到新的命令缓冲区中。像这样(注意我在浏览器中写了这段代码,所以它可能包含错误):

char xCommand[MAX_PATH] = {0};
strcpy_s(xCommand, MAX_PATH, lpCmdLine); // copy the original command line
strcat_s(xCommand, MAX_PATH, " -verify "); // append
strcat_s(xCommand, MAX_PATH, Parameters); // append

然后将此缓冲区传递给您的 ExecMain 函数:

procExecMain(hInstance, hPrevInstance, xCommand, nCmdShow);

【讨论】:

  • 我做了与您的解决方案类似的事情,但似乎 xCommand 被简单地忽略了。 lpCmdLine 只是传递给 Loader 的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2012-10-04
  • 1970-01-01
  • 2011-08-11
  • 2012-07-12
  • 2013-07-20
相关资源
最近更新 更多