将字符串附加到lpCmdLine WinMain

时间:2014-02-26 14:28:25

标签: c++ visual-c++

尝试为可执行文件创建加载程序时,如果在Parameters中提供的字符串长度超过某个长度,则无法执行。但是参数完全从初始化文件中读取。当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:通过_TRUNCATE替换MAX_PATH来修改代码。似乎适用于参数中的某些字符但超出时会崩溃。

1 个答案:

答案 0 :(得分:0)

以下是几个问题:

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);