Merge pull request #24 from yuanyuanxiang/bugFix
Fix OVERLAPPEDPLUS memory leak and Support `rundll32.exe`
This commit is contained in:
@@ -299,7 +299,7 @@ reorg: Move commands to common/commands.h
|
||||
增加显示被控程序"类型"的功能:如果被控程序为单个EXE则显示为"EXE",如果被控程序为EXE调用动态库形式,则显示为"DLL".
|
||||
当前,只有类型为DLL的服务支持在线升级。本次提交借机对前一个更新中的"预留字段"进行了验证。
|
||||
|
||||
|
||||
在动态链接库中增加导出函数Run,以便通过rundll32.exe调用动态链接库。这种形式也是支持在线对DLL进行升级的。
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -7,6 +7,13 @@
|
||||
#include <IOSTREAM>
|
||||
#include "LoginServer.h"
|
||||
#include "KernelManager.h"
|
||||
#include <iosfwd>
|
||||
#include <vector>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <shellapi.h>
|
||||
#include <corecrt_io.h>
|
||||
using namespace std;
|
||||
|
||||
// <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ֵ
|
||||
@@ -165,7 +172,10 @@ BOOL APIENTRY DllMain( HINSTANCE hInstance,
|
||||
extern "C" __declspec(dllexport) void TestRun(char* szServerIP,int uPort)
|
||||
{
|
||||
g_bExit = FALSE;
|
||||
g_SETTINGS.SetServer(szServerIP, uPort);
|
||||
if (strlen(szServerIP)>0 && uPort>0)
|
||||
{
|
||||
g_SETTINGS.SetServer(szServerIP, uPort);
|
||||
}
|
||||
g_SETTINGS.SetType(CLIENT_TYPE_DLL);
|
||||
|
||||
HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)StartClient,NULL,0,NULL);
|
||||
@@ -173,7 +183,7 @@ extern "C" __declspec(dllexport) void TestRun(char* szServerIP,int uPort)
|
||||
return;
|
||||
}
|
||||
#ifdef _DEBUG
|
||||
WaitForSingleObject(hThread, 200);
|
||||
WaitForSingleObject(hThread, INFINITE);
|
||||
#else
|
||||
WaitForSingleObject(hThread, INFINITE);
|
||||
#endif
|
||||
@@ -189,6 +199,99 @@ extern "C" __declspec(dllexport) bool IsStoped() { return g_bThreadExit; }
|
||||
// <20>Ƿ<EFBFBD><C7B7>˳<EFBFBD><CBB3>ͻ<EFBFBD><CDBB><EFBFBD>
|
||||
extern "C" __declspec(dllexport) BOOL IsExit() { return g_bExit; }
|
||||
|
||||
// copy from: SimpleRemoter\client\test.cpp
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD>DLL
|
||||
void RunNewDll(const char* cmdLine) {
|
||||
char path[_MAX_PATH], * p = path;
|
||||
GetModuleFileNameA(NULL, path, sizeof(path));
|
||||
while (*p) ++p;
|
||||
while ('\\' != *p) --p;
|
||||
*(p + 1) = 0;
|
||||
std::string folder = path;
|
||||
std::string oldFile = folder + "ServerDll.old";
|
||||
std::string newFile = folder + "ServerDll.new";
|
||||
strcpy(p + 1, "ServerDll.dll");
|
||||
BOOL ok = TRUE;
|
||||
if (_access(newFile.c_str(), 0) != -1) {
|
||||
if (_access(oldFile.c_str(), 0) != -1)
|
||||
{
|
||||
if (!DeleteFileA(oldFile.c_str()))
|
||||
{
|
||||
std::cerr << "Error deleting file. Error code: " << GetLastError() << std::endl;
|
||||
ok = FALSE;
|
||||
}
|
||||
}
|
||||
if (ok && !MoveFileA(path, oldFile.c_str())) {
|
||||
std::cerr << "Error removing file. Error code: " << GetLastError() << std::endl;
|
||||
if (_access(path, 0) != -1)
|
||||
{
|
||||
ok = FALSE;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
||||
if (SetFileAttributesA(oldFile.c_str(), FILE_ATTRIBUTE_HIDDEN))
|
||||
{
|
||||
std::cout << "File created and set to hidden: " << oldFile << std::endl;
|
||||
}
|
||||
}
|
||||
if (ok && !MoveFileA(newFile.c_str(), path)) {
|
||||
std::cerr << "Error removing file. Error code: " << GetLastError() << std::endl;
|
||||
MoveFileA(oldFile.c_str(), path);// recover
|
||||
}
|
||||
else if (ok) {
|
||||
std::cout << "Using new file: " << newFile << std::endl;
|
||||
}
|
||||
}
|
||||
char cmd[1024];
|
||||
sprintf_s(cmd, "%s,Run %s", path, cmdLine);
|
||||
ShellExecuteA(NULL, "open", "rundll32.exe", cmd, NULL, SW_HIDE);
|
||||
}
|
||||
|
||||
/* <20><><EFBFBD>пͻ<D0BF><CDBB>˵ĺ<CBB5><C4BA>Ĵ<EFBFBD><C4B4><EFBFBD>. <20><>Ϊ<EFBFBD><CEAA><EFBFBD>嵼<EFBFBD><E5B5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> rundll32 <20><><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>.
|
||||
HWND hwnd: <20><><EFBFBD><EFBFBD><EFBFBD>ھ<EFBFBD><DABE><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>Ϊ NULL<4C><4C><EFBFBD><EFBFBD>
|
||||
HINSTANCE hinst: DLL <20><>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
LPSTR lpszCmdLine: <20><><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int nCmdShow: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ״̬<D7B4><CCAC>
|
||||
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rundll32.exe ClientDemo.dll,Run 127.0.0.1:6543
|
||||
<EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>
|
||||
*/
|
||||
extern "C" __declspec(dllexport) void Run(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow) {
|
||||
char message[256] = { 0 };
|
||||
if (strlen(lpszCmdLine) != 0) {
|
||||
strcpy_s(message, lpszCmdLine);
|
||||
}else if (g_SETTINGS.IsValid())
|
||||
{
|
||||
sprintf_s(message, "%s:%d", g_SETTINGS.ServerIP(), g_SETTINGS.ServerPort());
|
||||
}
|
||||
|
||||
std::istringstream stream(message);
|
||||
std::string item;
|
||||
std::vector<std::string> result;
|
||||
while (std::getline(stream, item, ':')) {
|
||||
result.push_back(item);
|
||||
}
|
||||
if (result.size() == 1)
|
||||
{
|
||||
result.push_back("80");
|
||||
}
|
||||
if (result.size() != 2) {
|
||||
MessageBox(hwnd, "<EFBFBD><EFBFBD><EFBFBD>ṩ<EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ!", "<EFBFBD><EFBFBD>ʾ", MB_OK);
|
||||
return;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
TestRun((char*)result[0].c_str(), atoi(result[1].c_str()));
|
||||
while (!IsStoped())
|
||||
Sleep(20);
|
||||
} while (!IsExit());
|
||||
if (IsExit() == 1)
|
||||
return;
|
||||
sprintf_s(message, "%s:%d", g_SETTINGS.ServerIP(), g_SETTINGS.ServerPort());
|
||||
RunNewDll(message);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
DWORD WINAPI StartClient(LPVOID lParam)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
EXPORTS
|
||||
TestRun
|
||||
StopRun
|
||||
Run
|
||||
|
||||
@@ -140,6 +140,7 @@ enum
|
||||
|
||||
#define CLIENT_TYPE_DLL 0 // <20>ͻ<EFBFBD><CDBB>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD>DLL<4C><4C><EFBFBD><EFBFBD>
|
||||
#define CLIENT_TYPE_ONE 1 // <20>ͻ<EFBFBD><CDBB>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD>EXE<58><45><EFBFBD><EFBFBD>
|
||||
#define CLIENT_TYPE_MODULE 2 // DLL<4C><4C><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>س<EFBFBD><D8B3><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
typedef struct CONNECT_ADDRESS
|
||||
|
||||
@@ -198,10 +198,10 @@ void CMy2015RemoteDlg::OnIconNotify(WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
if (IsIconic())
|
||||
{
|
||||
ShowWindow(SW_NORMAL);
|
||||
ShowWindow(SW_SHOW);
|
||||
break;
|
||||
}
|
||||
ShowWindow(IsWindowVisible() ? SW_HIDE : SW_SHOWNORMAL);
|
||||
ShowWindow(IsWindowVisible() ? SW_HIDE : SW_SHOW);
|
||||
SetForegroundWindow();
|
||||
break;
|
||||
}
|
||||
@@ -431,7 +431,10 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
|
||||
|
||||
CreateSolidMenu();
|
||||
|
||||
ListenPort();
|
||||
if (!ListenPort()) {
|
||||
OnCancel();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#if !INDEPENDENT
|
||||
ShowWindow(SW_SHOW);
|
||||
@@ -571,6 +574,13 @@ void CMy2015RemoteDlg::OnTimer(UINT_PTR nIDEvent)
|
||||
|
||||
void CMy2015RemoteDlg::OnClose()
|
||||
{
|
||||
// <20><><EFBFBD>ش<EFBFBD><D8B4>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>ǹر<C7B9>
|
||||
ShowWindow(SW_HIDE);
|
||||
OutputDebugStringA("======> Hide\n");
|
||||
}
|
||||
|
||||
void CMy2015RemoteDlg::Release(){
|
||||
OutputDebugStringA("======> Release\n");
|
||||
isClosed = TRUE;
|
||||
ShowWindow(SW_HIDE);
|
||||
#if INDEPENDENT
|
||||
@@ -620,7 +630,6 @@ void CMy2015RemoteDlg::OnClose()
|
||||
m_iocpServer = NULL;
|
||||
}
|
||||
timeEndPeriod(1);
|
||||
CDialogEx::OnClose();
|
||||
}
|
||||
|
||||
|
||||
@@ -836,13 +845,15 @@ VOID CMy2015RemoteDlg::OnAbout()
|
||||
//<2F><><EFBFBD><EFBFBD>Menu
|
||||
void CMy2015RemoteDlg::OnNotifyShow()
|
||||
{
|
||||
ShowWindow(SW_SHOW);
|
||||
BOOL v= IsWindowVisible();
|
||||
ShowWindow(v? SW_HIDE : SW_SHOW);
|
||||
}
|
||||
|
||||
|
||||
void CMy2015RemoteDlg::OnNotifyExit()
|
||||
{
|
||||
SendMessage(WM_CLOSE);
|
||||
Release();
|
||||
CDialogEx::OnOK(); // <20>رնԻ<D5B6><D4BB><EFBFBD>
|
||||
}
|
||||
|
||||
|
||||
@@ -857,11 +868,11 @@ void CMy2015RemoteDlg::OnMainSet()
|
||||
|
||||
void CMy2015RemoteDlg::OnMainExit()
|
||||
{
|
||||
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
SendMessage(WM_CLOSE);
|
||||
Release();
|
||||
CDialogEx::OnOK(); // <20>رնԻ<D5B6><D4BB><EFBFBD>
|
||||
}
|
||||
|
||||
VOID CMy2015RemoteDlg::ListenPort()
|
||||
BOOL CMy2015RemoteDlg::ListenPort()
|
||||
{
|
||||
int nPort = ((CMy2015RemoteApp*)AfxGetApp())->m_iniFile.GetInt("settings", "ghost");
|
||||
//<2F><>ȡini <20>ļ<EFBFBD><C4BC>еļ<D0B5><C4BC><EFBFBD><EFBFBD>˿<EFBFBD>
|
||||
@@ -871,11 +882,11 @@ VOID CMy2015RemoteDlg::ListenPort()
|
||||
nPort = 6543;
|
||||
if (nMaxConnection <= 0)
|
||||
nMaxConnection = 10000;
|
||||
Activate(nPort,nMaxConnection); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
||||
return Activate(nPort,nMaxConnection); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
|
||||
}
|
||||
|
||||
|
||||
VOID CMy2015RemoteDlg::Activate(int nPort,int nMaxConnection)
|
||||
BOOL CMy2015RemoteDlg::Activate(int nPort,int nMaxConnection)
|
||||
{
|
||||
m_iocpServer = new IOCPServer; //<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
UINT ret = 0;
|
||||
@@ -885,11 +896,15 @@ VOID CMy2015RemoteDlg::Activate(int nPort,int nMaxConnection)
|
||||
char code[32];
|
||||
sprintf_s(code, "%d", ret);
|
||||
MessageBox("<EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><EFBFBD><EFBFBD>StartServerʧ<EFBFBD><EFBFBD>! <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:"+CString(code));
|
||||
delete m_iocpServer;
|
||||
m_iocpServer = NULL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
CString strTemp;
|
||||
strTemp.Format("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˿<EFBFBD>: %d<>ɹ<EFBFBD>", nPort);
|
||||
ShowMessage(true,strTemp);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -53,8 +53,8 @@ public:
|
||||
VOID CreateToolBar();
|
||||
VOID CreateNotifyBar();
|
||||
VOID CreateSolidMenu();
|
||||
VOID ListenPort();
|
||||
VOID Activate(int nPort,int nMaxConnection);
|
||||
BOOL ListenPort();
|
||||
BOOL Activate(int nPort,int nMaxConnection);
|
||||
|
||||
static VOID CALLBACK NotifyProc(CONTEXT_OBJECT* ContextObject);
|
||||
static VOID CALLBACK OfflineProc(CONTEXT_OBJECT* ContextObject);
|
||||
@@ -75,6 +75,7 @@ public:
|
||||
CBitmap m_bmOnline[3];
|
||||
afx_msg void OnTimer(UINT_PTR nIDEvent);
|
||||
afx_msg void OnClose();
|
||||
void Release();
|
||||
afx_msg void OnSize(UINT nType, int cx, int cy);
|
||||
afx_msg void OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult);
|
||||
afx_msg void OnOnlineMessage();
|
||||
|
||||
@@ -54,7 +54,21 @@ void CBuildDlg::OnBnClickedOk()
|
||||
DWORD dwFileSize;
|
||||
UpdateData(TRUE);
|
||||
int index = m_ComboExe.GetCurSel();
|
||||
CString file = index == 0 ? "TestRun.exe" : (index == 1 ? "ghost.exe" : "");
|
||||
CString file;
|
||||
switch (index)
|
||||
{
|
||||
case CLIENT_TYPE_DLL:
|
||||
file = "TestRun.exe";
|
||||
break;
|
||||
case CLIENT_TYPE_ONE:
|
||||
file = "ghost.exe";
|
||||
break;
|
||||
case CLIENT_TYPE_MODULE:
|
||||
file = "ServerDll.dll";
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (file.IsEmpty())
|
||||
{
|
||||
MessageBox("<EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɷ<EFBFBD><C9B7><EFBFBD>!");
|
||||
@@ -107,7 +121,13 @@ void CBuildDlg::OnBnClickedOk()
|
||||
}
|
||||
memcpy(szBuffer+iOffset,&g_ConnectAddress,sizeof(g_ConnectAddress));
|
||||
//<2F><><EFBFBD>浽<EFBFBD>ļ<EFBFBD>
|
||||
strcpy(p+1, "ClientDemo.exe");
|
||||
if (index == CLIENT_TYPE_MODULE)
|
||||
{
|
||||
strcpy(p + 1, "ClientDemo.dll");
|
||||
}
|
||||
else {
|
||||
strcpy(p + 1, "ClientDemo.exe");
|
||||
}
|
||||
strSeverFile = path;
|
||||
DeleteFileA(path);
|
||||
BOOL r=File.Open(strSeverFile,CFile::typeBinary|CFile::modeCreate|CFile::modeWrite);
|
||||
@@ -157,8 +177,9 @@ BOOL CBuildDlg::OnInitDialog()
|
||||
CDialog::OnInitDialog();
|
||||
|
||||
// TODO: <20>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>Ӷ<EFBFBD><D3B6><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><CABC>
|
||||
m_ComboExe.InsertString(0, "TestRun.exe");
|
||||
m_ComboExe.InsertString(1, "ghost.exe");
|
||||
m_ComboExe.InsertString(CLIENT_TYPE_DLL, "TestRun.exe");
|
||||
m_ComboExe.InsertString(CLIENT_TYPE_ONE, "ghost.exe");
|
||||
m_ComboExe.InsertString(CLIENT_TYPE_MODULE, "ServerDll.dll");
|
||||
m_ComboExe.SetCurSel(0);
|
||||
|
||||
return TRUE; // return TRUE unless you set the focus to a control
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "2015Remote.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#if USING_ZLIB
|
||||
#include "zlib.h"
|
||||
#define Z_FAILED(p) (Z_OK != (p))
|
||||
@@ -113,6 +114,7 @@ IOCPServer::~IOCPServer(void)
|
||||
{
|
||||
CONTEXT_OBJECT *ContextObject = m_ContextConnectionList.GetHead();
|
||||
RemoveStaleContext(ContextObject);
|
||||
SAFE_DELETE(ContextObject->olps);
|
||||
}
|
||||
|
||||
while (!m_ContextFreePoolList.IsEmpty())
|
||||
|
||||
@@ -138,6 +138,7 @@ protected:
|
||||
CRITICAL_SECTION* m_cs;
|
||||
};
|
||||
|
||||
#define TRACK_OVERLAPPEDPLUS 0
|
||||
|
||||
class OVERLAPPEDPLUS
|
||||
{
|
||||
@@ -148,9 +149,9 @@ public:
|
||||
|
||||
OVERLAPPEDPLUS(IOType ioType)
|
||||
{
|
||||
#if 0
|
||||
#if TRACK_OVERLAPPEDPLUS
|
||||
char szLog[100];
|
||||
sprintf_s(szLog, "=> [new] OVERLAPPEDPLUS %x by thread [%d].\n", this, GetCurrentThreadId());
|
||||
sprintf_s(szLog, "=> [new] OVERLAPPEDPLUS %p by thread [%d].\n", this, GetCurrentThreadId());
|
||||
OutputDebugStringA(szLog);
|
||||
#endif
|
||||
ZeroMemory(this, sizeof(OVERLAPPEDPLUS));
|
||||
@@ -159,9 +160,9 @@ public:
|
||||
|
||||
~OVERLAPPEDPLUS()
|
||||
{
|
||||
#if 0
|
||||
#if TRACK_OVERLAPPEDPLUS
|
||||
char szLog[100];
|
||||
sprintf_s(szLog, "=> [delete] OVERLAPPEDPLUS %x by thread [%d].\n", this, GetCurrentThreadId());
|
||||
sprintf_s(szLog, "=> [delete] OVERLAPPEDPLUS %p by thread [%d].\n", this, GetCurrentThreadId());
|
||||
OutputDebugStringA(szLog);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -38,6 +38,12 @@
|
||||
// VS2017<31><37>ǰ<EFBFBD>汾<EFBFBD><E6B1BE>VLD: https://kinddragon.github.io/vld
|
||||
// VS2019ʹ<39>õ<EFBFBD>VLD<4C><44>֧<EFBFBD><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>VS<56>汾, <20>Ƽ<EFBFBD><C6BC><EFBFBD>: https://github.com/oneiric/vld/releases/tag/v2.7.0
|
||||
// <20><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ܿض˳<D8B6><CBB3><EFBFBD><EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ʹ<EFBFBD><CAB9>Releaseģʽ<C4A3><CABD><EFBFBD>ɵij<C9B5><C4B3><EFBFBD>, <20>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD>VLD<4C><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>VLD<4C><44><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>һͬ<D2BB><CDAC><EFBFBD><EFBFBD>.
|
||||
// <20><><EFBFBD><EFBFBD>VLD<4C><44>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>й¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٲ<EFBFBD><D9B2>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>÷<EFBFBD><C3B7>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ء<EFBFBD><D8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Գ<EFBFBD><D4B3><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>Թ<EFBFBD><D4B9>ߣ<EFBFBD><DFA3><EFBFBD> Visual Studio <20><> WinDbg<62><67><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><CBB7>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ȱʧ<C8B1>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> dbghelp.pdb<64><62><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>仺<EFBFBD>浽<EFBFBD><E6B5BD><EFBFBD>ط<EFBFBD><D8B7><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD>÷<EFBFBD><C3B7>ŷ<EFBFBD><C5B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Visual Studio Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Visual Studio <20>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> > ѡ<><D1A1> > <20><><EFBFBD>š<EFBFBD>
|
||||
// <20><>ѡ Microsoft Symbol Servers. ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><C5BB><EFBFBD>Ŀ¼<C4BF><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> "C:\Symbols"<22><>
|
||||
// <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ȱʧ<C8B1>ķ<EFBFBD><C4B7>ţ<EFBFBD><C5A3><EFBFBD> dbghelp.pdb<64><62><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC>
|
||||
#include "vld.h"
|
||||
|
||||
#include "targetver.h"
|
||||
|
||||
Reference in New Issue
Block a user