【发布时间】: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进入WinMain的lpCmdLine听起来是个坏主意。 -
有什么解决方法吗?既然我已经提到过,它适用于较小的字符串,适用于较大的字符串或无字符串(Null)
-
只需放弃
strcpy_s呼叫,并将xCommand直接传递给procExecMain -
@IgorTandetnik 参数被读取,但似乎被可执行文件忽略(甚至“-verify”)。我尝试将 char* 转换为 char(strncpy) 但没有运气。 PS:lpCmdLine 是 LPSTR。
标签: c++ visual-c++