visual studio 메뉴 - 디버그 - 창 - 예외처리 - Managed Debugging Assistants - ContexSwitchDeadlock 체크해제

 

- 에러화면

- 에러내용

추가 정보: CLR에서 60초 동안 COM 컨텍스트 0x10681a8에서 COM 컨텍스트 0x1068260(으)로 전환하지 못했습니다. 대상 컨텍스트/아파트를 소유하는 스레드가 펌프 대기를 수행하지 않거나, Windows 메시지를 펌프하지 않고 매우 긴 실행 작업을 처리하고 있는 것 같습니다. 이러한 상황은 대개 성능에 부정적인 영향을 주며 응용 프로그램이 응답하지 않거나 시간이 흐름에 따라 메모리 사용이 증가하는 문제로 이어질 수도 있습니다. 이 문제를 방지하려면 모든 STA(Single Threaded Apartment) 스레드가 펌프 대기 기본 형식(예: CoWaitForMultipleHandles)을 사용하고 긴 실행 작업 동안 지속적으로 메시지를 펌프해야 합니다.

 

- 메뉴 위치

 

 

 

 

출처 : https://jujun.tistory.com/163

실행파일 경로 얻기

 

// 실행파일이 존재하는 폴더 경로 반환
CString CAutoSaveDlg::GetModulePath()
{
TCHAR szPath[MAX_PATH];
memset(szPath, 0x00, MAX_PATH);

::GetModuleFileName(NULL, szPath, MAX_PATH);

CString sTempPath = szPath;
int iLength = sTempPath.GetLength();
int iPos = sTempPath.ReverseFind(TCHAR('\\'));

CString sModulePath = sTempPath.Left(iPos);
sModulePath += _T("\\");
return sModulePath;
}

데이터베이스 이름 옆에 (주의 대상) 나타날때

 

MSSQL 관리자 권한으로 실행

 

EXEC sp_resetstatus '데이터베이스명';
ALTER DATABASE 데이터베이스명 SET EMERGENCY
DBCC checkdb('데이터베이스명')
ALTER DATABASE 데이터베이스명 SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CheckDB ('데이터베이스명', REPAIR_ALLOW_DATA_LOSS)
ALTER DATABASE 데이터베이스명 SET MULTI_USER

예시)

EXEC sp_resetstatus 'CELL_SURFACE';
ALTER DATABASE CELL_SURFACE SET EMERGENCY
DBCC checkdb('CELL_SURFACE')
ALTER DATABASE CELL_SURFACE SET SINGLE_USER WITH ROLLBACK IMMEDIATE
DBCC CheckDB ('CELL_SURFACE', REPAIR_ALLOW_DATA_LOSS)
ALTER DATABASE CELL_SURFACE SET MULTI_USER

 

출처 : https://idchowto.com/?p=5815

this.Invoke(new Action(delegate ()

{

  //동작

 timer1.Start();

 

}));

////////////////////////////////////////////////////////////////////////////////////////

 

 

if (컨트롤 변수명.InvokeRequired == true)

{

컨트롤 변수명.Invoke((MethodInvoker)delegate

{

   컨트롤들 수정

});

}

 

 

ex)

if (dataGridViewTable.InvokeRequired == true)

{

 dataGridViewTable.Invoke((MethodInvoker)delegate

 {

//동작
         isLoadData = false;
    });
}
else

//동작
     isLoadData = false;
}

윈도우 시작시 자동로그인 설정

 

Win + R  - netplwiz - 사용자 계정

사옹쟈 이름과 암호를 입력해야 이 컴퓨터를 사용할 수 있음 - 체크 해제

 

 * 위에 체크박스가 없는 경우

 

 

Win + R  - regedit -

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\PasswordLess\Device
이동

DevicePassword 값을 2 에서 0으로 수정 후

Win + R  - netplwiz - 사용자 계정 

체크박스 표시됨

 

 

//CString to BYTE*

CString str;

str = _T("TEST");

BYTE* By;

By = new BYTE(str.GetLength()+1);

strcpy((char*)By;, CT2A(str));

delete[] By

//CString to BYTE*

CString str;

str = _T("TEST");

std::string strData = CT2CA(str);

int nDataLength = strData.length();

BYTE* By;

By = new BYTE(nDataLength);

ZeroMemory(By , sizeof(BYTE) * nDataLength);

for (int i = 0; i < nDataLength; i++)

{

By[i] = strData.at(i);

}

delete[] By

CSTring 에서 const *char 로 변환할 수 없습니다.

 

//유니코드일때

FILE *fp;

USES_CONVERSION;

fp = fopen(T2A(m_strPath), "r");

std::string command;

CString str;

command = std::string(CT2CA(str.operator LPCWSTR()));

//command.c_str()

//사용

nResult = sqlite3_exec(pDB, command.c_str(), NULL, NULL, &pErr);

 

//////

 

유니코드 일때.

CString strTest;

strTest = "";

char* Buff = new char[strTest.GetLength()];

strcpy(Buff,CT2A(strTest));

다른방법

CString csFullAddr = _T("TEST");

CStringA csAFullAddr = CStringA(csFullAddr);

const char* cFullAddr = csAFullAddr;

char* cpFullAddr = const_cast<char*>(cFullAddr);

 

속성 - 전처리기 - _CRT_SECURE_NO_WARNINGS

또는

가장 윗줄에

#define _CRT_SECURE_NO_WARNINGS

또는

프로젝트 생성시 SDK 체크 해제

위와 같이 코드 사용시

Buff 를 delete 를 해준다.

Buff 할당은 strTest 의 크기로 할당하였으나

delete 는 널문자를 포함한 크기를 해제하기 때문에 크기가 맞지 않아 에러 발생

char* Buff = new char[strTest.GetLength()]; 라인을

char* Buff = new char[strTest.GetLength()+1]; 로 수정 후

delete Buff; 해주면 된다.

유니코드 환경에서 변환

CString uni_char_to_CString_Convert(char *data)

{

// Unicode char* -> CString 변환 과정

// char* -> wchar* -> CString 순서로 변환 되어야 함

int len;

CString str;

BSTR buf;

// 1. char* to wchar * conversion

len = MultiByteToWideChar(CP_ACP, 0, data, strlen(data), NULL, NULL);

buf = SysAllocStringLen(NULL, len);

MultiByteToWideChar(CP_ACP, 0, data, strlen(data), buf, len);

// 2. wchar_t* to CString conversion

str.Format(_T("%s"), buf);

return str;

}

char* CString_to_uni_char_Convert(CString data)

{

// Unicode CString -> char* 변환 과정

// CString -> wchar* -> char* 순서로 변환 되어야 함

wchar_t *wchar_str;

char *char_str;

int char_str_len;

// 1. CString to wchar * conversion

wchar_str = data.GetBuffer(data.GetLength());

char_str_len = WideCharToMultiByte(CP_ACP, 0, wchar_str, -1, NULL, 0, NULL, NULL);

char_str = new char[char_str_len];

// 2. wchar_t* to char* conversion

WideCharToMultiByte(CP_ACP, 0, wchar_str, -1, char_str, char_str_len, 0, 0);

return char_str ;

}

 

출처 : https://blog.naver.com/ikariksj/140186998237

1. Cstring -> string

CString strPath ;

string strReuslt;

strResult = ((string)CT2CA(strPath.operator LPCWSTR()))

///////////////////////////////////////////////

CString strPath ;

string strReuslt;

CT2CA pszConvert(strPath );

string strReuslt(pszConvert);

 

 

2. string -> Cstring

  string strPath ;
  CString strReuslt;
  strReuslt.Format(_T("%S"), strPath .c_str());

//
-  CString strReuslt(strPath .c_str());

- strReuslt = strPath .c_str();

- strReuslt = CString::CStringT(CA2CT(strPath.c_str())); 

// 헤더파일 포함

#include <filesystem>

 

 

//가져오기

vector<string> vcDrawFname;

string strDrawDirname = "D:\\";

 for (auto& p : experimental::filesystem::directory_iterator(strDrawDirname))
 {
  vcDrawFname.push_back(strDrawDirname + "\\" + p.path().filename().string());
 }

 

 

vs2022사용시 에러

프로젝트 - 속성 - 구성속성 - 일반 - c++언어표준 

ISO C++ 17표준 선택

// 헤더파일 포함
#include <filesystem>




//가져오기
vector<string> vcDrawFname;
string strDrawDirname = "D:\\";
 for (auto& p : std::filesystem::directory_iterator(strDrawDirname))
 {
  vcDrawFname.push_back(strDrawDirname + "\\" + p.path().filename().string());
 }

 

 

윈도우버전 프레임워크 버전
윈도우7  .NET Framework 3.5
윈도우8  .NET Framework 3.5
 .NET Framework 4.5
윈도우8.1  .NET Framework 3.5
 .NET Framework 4.5.1
윈도우10  .NET Framework 3.5
 .NET Framework 4.6

 

출처 : docs.microsoft.com/ko-kr/dotnet/framework/migration-guide/versions-and-dependencies?redirectedfrom=MSDN

1. 텔레그램 설치 후 회원가입

2. 채팅방목록에서 돋보기 클릭하여 검색

 

 

3. BotFather 검색하여 채팅방 접속

 

 

4. 시작버튼 보이면 시작버튼 클릭

 

 

5. /newbot 입력

 

 

6. 봇 이름 입력 ( 별명같은 거, 채팅방 메인 이름)

7. 봇 이름 입력 ( 아이디같은거)  끝은 _bot로 끝나야 함

8. 숫자가 앞에 들어가서 안되는 것 같아 숫자를 중간에 넣어 생성

9. HTTP API 부분은 API로 사용가능

 

 

10. /mybots 입력시 봇 목록이 나오고 봇을 선택하면 아래와 같은 선택지가 나옴

     API 토큰 확인이나 봇 삭제  가능

 

11. 채팅방 돋보기 검색으로 자신의 봇 이름 검색

 

 

12. 시작 클릭시 봇 시작

+ Recent posts