2012-07-10 46 views
0

我写了一个函数来创建在指定目录下的文本文件,并写入当前的ProcessID它我的函数来创建一个锁定文件会导致访问冲突

的函数被调用时点击了确定按钮时对话框,它似乎做我想要的,但是当我调用它时,应用程序在对话框关闭时崩溃。 (如果我删除我的功能,它会关闭没有麻烦)。

这是我有:

void LockFolder(UnicodeString folderLocation) 
{ 
    DWORD processID = GetCurrentProcessId(); 
    _TCHAR currentProcessID[sizeof(DWORD)]; 
    _TCHAR* lockID; 
    _TCHAR* lock = folderLocation.c_str(); 
    fstream lockFile; 

    _stprintf(currentProcessID,_T("%i"),processID); 
    _tcscat(lock,_T("Lock.txt")); 

    lockFile.open(lock,ios::out); 
    lockFile<<currentProcessID; 
    lockFile.close(); 
} 

做出了一些改变,但问题仍然存在, 版本2:

void LockFolder(UnicodeString folderLocation) 
{ 
    DWORD processID = GetCurrentProcessId(); 
    _TCHAR* lock = folderLocation.c_str(); 
    _tcscat(lock,_T("Lock.txt")); 

    fstream lockFile; 
    lockFile.open(lock,ios::out); 
    lockFile<<processID<<"\0"; 
    lockFile.close(); 
} 
+0

什么是'folderLocation'?如果它是std :: wstring,则不能将其c_str()结果指定为wchar_t *,因为它应该是const wchar_t *,然后不能将其用作_tcscat输出缓冲区! – 2012-07-10 17:18:14

+0

既不会输出一个字符串数组,也不是空终止的,因为它衰减到一个指针并被解释为一个C字符串。 – 2012-07-10 17:20:54

+0

该字符串现在是空终止,文本文件似乎正在写好,但我仍然得到崩溃:s – 2012-07-10 17:28:10

回答

0

在这行你破坏堆:

_TCHAR* lock = folderLocation.c_str(); 
_tcscat(lock,_T("Lock.txt")); 

取而代之,请执行以下操作:

std::stringstream str; // or wstringstream 
str << folderLocation << "Lock.txt"; // or L"Lock.txt" 
std::string lock = str.str(); // or wstring