본문 바로가기

분류 전체보기115

C++ DLL 을 C# 에서 사용하기 1. Visual Studio 에서 솔루션 구성을 위한 빈 솔루션 생성 기타 프로젝트 형식 - Visual Studio 솔루션 - 빈 솔루션 2. C++ DLL 프로젝트 생성 추가 - 새 프로젝트 Visual C++ - Windows 데스크톱 - DLL(동적 연결 라이브러리) 3. CppLib 프로젝트 속성 변경 출력 디렉토리 변경 기존 : $(SolutionDir)$(Configuration)\ 변경 : $(SolutionDir)CSApp\bin\$(Configuration) 4. C# App 프로젝트 생성 추가 - 새 프로젝트 다른 언어 - Visual C# - Windows Desktop - 콘솔 앱(.NET Framework) 5. 프로젝트 구성 완료 6. CSApp 시작 프로젝트로 설정 7. C.. 2022. 8. 29.
PInvokeStackImbalance 기존 아래와 같이 사용하던 코드에서 에러가 발생 [DllImport("CppLib.dll")] CallingConvention 추가 [DllImport("CppLib.dll", CallingConvention = CallingConvention.Cdecl)] C++ : Cdecl Delphi : StdCall C++ DLL 을 C# 에서 사용하기 C++ DLL 을 C# 에서 사용하기 1. Visual Studio 에서 솔루션 구성을 위한 빈 솔루션 생성 기타 프로젝트 형식 - Visual Studio 솔루션 - 빈 솔루션 2. C++ DLL 프로젝트 생성 추가 - 새 프로젝트 Visual C++ - Windows 데스크톱 - DLL(동적 연.. doublerabbits.tistory.com 2022. 8. 29.
Button 비활성화 상태에서 클릭 처리 버튼이 IsEnabled="False" 상태일때도 버튼 클릭 처리가 필요한 경우 트릭을 이용해서 아래와 같이 처리한다. 기존 버튼을 상속 받아 새로운 버튼을 만든다. IsDefault 속성이 false 인경우 비활성화 버튼처럼 표시하도록 한다. 버튼을 사용하는 코드에서 IsEnabled 속성 대신에 IsDefault 를 사용한다. 2022. 8. 20.
Generic https://www.youtube.com/watch?v=l6s7AvZx5j8 2022. 8. 16.
Progress with Async/Await MainWindow.xaml MainWindow.xaml.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Window.. 2022. 8. 15.
View - ViewModel 바인딩 이름 App.xaml.cs 파일에 내용 추가 protected override void ConfigureViewModelLocator() { base.ConfigureViewModelLocator(); ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) => { var prefix = viewType.FullName.Replace(".Views", ".ViewModels"); var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName; var viewModelName = $"{prefix}_ViewModel, {viewAssemblyName}"; return Type.. 2022. 8. 15.
Prism Template Pack Prism Template 적용 확장 - 확장 관리 "prism" 검색 Prism Template Pack 설치 열려 있는 Visual Studio 종료 Visual Studio 새 프로젝트 만들기 Prism 프로젝트 선택 2022. 8. 15.
컨트롤이 자신이 만들어진 스레드가 아닌 스레드에서 액세스되었습니다. C# WinForm 에서 작업(Work) 스레드에서 GUI Control 을 직접 호출하거나 변경하려는 경우 에러 발생 작업 스레드에서 GUI Control 을 호출하는 경우 아래의 순서를 따른다. 1. 호출하려는 컨트롤의 InvokeRequired 속성을 쿼리한다. 2. InvokeRequired 의 결과가 true 인 경우, delegate 를 이용하여 Invoke 를 호출한다. 3. InvokeRequired 의 결과가 false 인 경우 컨트롤을 직접 호출한다. Thread workThread; private void btnWorkThreadStart_Click(object sender, EventArgs e) { this.workThread = new Thread(new ThreadStart(t.. 2022. 8. 12.
MSB3392 error MSB3392: "D:\WORK\Sample.dll" 어셈블리의 등록을 취소할 수 없습니다. 액세스가 거부되었습니다. 관리자로 응용 프로그램을 실행하고 있는지 확인하십시오. 요청한 레지스트리에 액세스할 수 없습니다. Visual Studio 를 관리자 권한으로 재실행한다. 2022. 8. 12.
MSB3270 빌드 중인 프로젝트의 프로세서 아키텍처 참조의 프로세서 아키텍처 "XXX" 이(가) 일치하지 않습니다. DLL 을 컴파일 할때의 CPU 와 DLL 을 사용하는 EXE 의 CPU 셋팅이 다른 경우 발생 1. DLL 컴파일 환경을 DLL 을 사용하는 EXE 와 맞춰서 설정 후 빌드 (CPU 구성 관리자를 통해 빌드 환경을 추가하거나 변경) 2. EXE 에서 DLL 참조 부분을 새로 추가한 DLL 로 변경 2022. 8. 12.
폼 닫기 버튼 클릭시 Close() 대신 다른 기능 호출하기 e.Cancel = true; private void SampleForm_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason == CloseReason.UserClosing) { e.Cancel = true; Hide(); } } 2022. 8. 12.
Windows 11 더 많은 옵션 표시 항상 표시 보호되어 있는 글 입니다. 2022. 8. 12.
string formatting #include #include #include #include using namespace std; template std::string StringFormat(const std::string& format, Args ... args) { int bufSize = std::snprintf(nullptr, 0, format.c_str(), args ...) + 1; if (bufSize 2022. 8. 9.
string split #include #include #include #include using namespace std; vector StringSplit(string sourceString, char delimeter) { vector ss; string::size_type prevPos = 0, curPos = 0; while ((curPos = sourceString.find(delimeter, curPos)) != std::string::npos) { string substring(sourceString.substr(prevPos, curPos - prevPos)); ss.push_back(substring); prevPos = ++curPos; } ss.push_back(sourceString.substr(prev.. 2022. 8. 8.
VSC 초기화 오류 보호되어 있는 글 입니다. 2022. 8. 7.
string 선언 string str1("ABCDE"); string str2 = "12345"; string str3(str1); 데이터 순환 for (int i = 0; i < str1.size(); i++) { cout 2022. 8. 6.
queue 선언 queue queue1; 마지막 요소에 데이터 추가 queue1.push(11); queue1.push(22); queue1.push(33); queue1.push(44); queue1.push(55); 첫번째 요소 데이터 조회 queue1.front() 첫번째 요소 데이터 추출 queue1.pop(); 큐가 비어있는지 확인 queue1.empty(); 데이터 순환 size = (int)queue1.size(); for (int i = 0; i < size; i++) { printf("%d \n", queue1.front()); queue1.pop(); } printf("queue1 size(%d) = %zd \n\n", queue1.empty(), queue1.size()); 데이터 교체 queu.. 2022. 8. 6.
map map 은 Key 값을 기준으로 중복 데이터가 불가 선언 map map1; 데이터 추가 map1.insert({ "1st", 111 }); map1.insert({ "2nd", 222 }); map1.insert({ "3rd", 333 }); map1.insert({ "4th", 444 }); map1.insert({ "5th", 555 }); 데이터 변경 map1["1st"] = 1; map1["Last"] = 999; 데이터 찾기 및 삭제 iter = map1.find("4th"); if (iter == map1.end()) { printf("4th not found \n"); } else { cout 2022. 8. 6.
list 선언 list list1; 리스트 뒤에 데이터 추가 list1.push_back(44); list1.push_back(55); 리스트 앞에 데이터 추가 list1.push_front(33); list1.push_front(22); list1.push_front(11); 리스트 특정 위치에 데이터 추가 iter = list1.begin(); iter++; list1.insert(iter, 777777); list1.insert(iter, 888888); list1.insert(iter, 999999); 리스트 최초 요소 데이터 조회 printf("first element : %d \n\n", list1.front()); 리스트 마지막 요소 데이터 조회 printf("last element : %d \n\n.. 2022. 8. 6.
vector 선언 vector vec1; 마지막 요소에 데이터 추가 vec1.push_back(10); vec1.push_back(20); 마지막 요소의 데이터 삭제 vec1.pop_back(); 특정 요소 삭제 (0 base 에서 4, 5 번 요소 삭제) vec1.erase(vec1.begin() + 3, vec1.begin() + 5); 전체 데이터 삭제 vec1.clear(); 데이터 순환 for (iter = vec1.begin(); iter != vec1.end(); ++iter) { printf("%d \n", (int)(*iter)); } printf("vec1 size = %zd \n\n", vec1.size()); 데이터 복사 vector vec2 = vector(vec1.begin(), vec1.b.. 2022. 8. 6.