안녕하세요 현재 하나하나 따라하면서 진행하고 있습니다. 로컬 디버거까지는 잘됐는데, 원격 디버거가 안붙는데 무슨 문제인지 모르겠어서 질문 글 남깁니다. 호스트의 경우 이 상태에서 연결이 안되는 상태이고 가상환경은 이 상태입니다. 혹시 가상환경이 32bit가 아니라 64비트로 되어있어서 진행이 안되는건지 아니면 호스트 컴퓨터에 다른 세팅을 더 해야하는건지 궁금해서 이렇게 글 납깁니다! 강의 정말 잘 보고 있습니다.
PAE(물리적 주소 확장)는 x86 프로세서가 지원되는 Windows 버전에서 4GB 이상의 실제 메모리에 액세스할 수 있도록 하는 프로세서 기능입니다. x86 기반 시스템에서 실행되는 특정 32비트 버전의 Windows Server는 프로세서의 실제 주소 크기에 따라 PAE를 사용하여 최대 64GB 또는 128GB의 실제 메모리에 액세스할 수 있습니다. 자세한 내용은 Windows 릴리스에 대한 메모리 제한을 참조하세요 . Physical Address Extension 인 것 같습니다
코드는 그대로 복사해서 붙여넣었습니다. 영상에 나온대로 디버그 모드로 실행한 후 키를 눌러도, 예외처리창이 나타나지 않는데.. vs설정이 다른 걸까요? - 예외설정에서 C++ Exceptions, Win32 Exceptions, CommonLanguage Exceptions들을 전부 체크해도 동일합니다. (vscode 예외설정창) (콘솔창/vs출력창)
2 ^ 64 = 16 엑사바이트 (EB)로 나오는데 32비트 운영체제와 비교했을 때 크기가 너무 차이가 나서 어색합니다.. 찾아보니 전부다 사용하는 게 아니라 일정 부분만 사용한다고 하는데 64 비트 운영체제의 가상메모리 크기와, 유저모드, 커널모드 크기가 어떻게 되는지 알 수 있을까요
Overlapped IO에서 SleepEX 같은 함수로 Alertable Wait상태로 진입할 수 있잖아요? IOCP 같은 경우 GetQueuedCompletionStatus 상태로 콜백함수를 호출할 수 있는 환경을 만들어주면 그 상태도 Alertable Wait 상태라고 할 수 있을까요?
ThreadSemaphore의 매개변수는 LPVOID인데 이것은 void*를 의미 한다고 알고 있습니다. 어떻게 int로 변환이 가능한 것인가요?? 추측은 데이터 값이 가지고 있는 비트 그 자체를 형식만 주소로 변경된 데이터 값을 다루는 것 같은데 맞게 이해 했는지 모르겠습니다!
강의 내용을 기반으로 제프리 리처 <Windows via C/C++> 을 읽으며 생긴 질문이 있어서 여쭤봅니다. 5판 번역본 기준 730p 입니다. /DelayLoad:MyDll.dll <- 지연로딩할 dll 을 사용하면 링커에게 "실행 모듈의 임포트 섹션으로부터 MyDll.dll 파일을 제거하여 프로세스를 초기화할 때 해당 DLL 을 암시적으로 로드하지 못하도록 한다. 라고 되어 있습니다. (730페이지 상단) 이후에 지연로드 된 함수가 호출되었을 때 해당 함수를 익스포트하고 있는 DLL 이 존재하지 않으면 __delayLoadHelper2() 는 exception 을 던진다고 나와있습니다. (730페이지 3번째 문단) 궁금한 점은 "임포트 섹션에서 MyDll.dll 제거할 때 해당하는 dll 이 없으면 링크타임이나 로드할 때 에러를 발생시키면 되는데 왜 굳이 런타임에 exception 을 던지는지?" 궁금합니다. 항상 유익한 강의 감사합니다 😄
_beginthreadEx() 이 친구가 Thread safe하지 않은 함수가 있을 때, 해당 함수들을 문제없게끔(?) 부르도록 Thread를 create하는 것 까지는 이해가 됬는데, 원리가 궁금해집니다. 내부적으로 Lock을 하거나, 임계영역을 설정하는 등의 동기화 기법을 자동으로 하는 건가요? 아니면, 혹시 관련된 자료를 어디서 얻을 수 있을까요.. 구글링을 열심히 해봤지만 관련자료가 안나와서 선장님께 질문드려봅니다.
안녕하세요. 네트워크 환경 설정에서 "vi etc/network/interfaces"를 입력했을때 파란 물결과 함께 Edit 창만 뜨고 강의와 같은 화면이 보이질 않네요.. ubuntu-24.04 버전인데요 구글링 해봐도 마땅히 해결책을 찾질 못해서.. 이후에 어떻게 진행해야하는지 알 수 있을까요? 감사합니다.
과제로 내주신 memcpy 문제는 압축도 풀리고 파일도 제대로 열립니다. 그런데 예제의 strcpy_s()의 경우는 MYFILE.TXT를 열어보면 문자가 다깨지고 길이도 이상합니다. 디버그 모드로 메모리를 보면 값이 제대로 들어가는게 보입니다만... 해결방법을 찾지 못하겠습니다. 해결법이 있을까요?
강의 내용중 비동기 입출력 CALLBACK 함수 사용 부분에서 OVERLAPPED 구조체와 BUFFER 를 동적할당 해야 한다고 하셨는데. 하지만 비동기 I/O를 하고 있는 스레드가 마지막 부분에서 SleepEx(1, TRUE) 로 대기하고 있습니다. 즉 스레드는 해당 CALL 함수 종료 후에도 계속 존재하기 때문에 스래드의 로컬변수로 선언해서 전달해도 CALLBACK 함수에서 사용하는데는 문제가 없는거 아닌지요? (이벤트로 처리하는 부분은 스레드 변수로 처리) 왜 동적변수로 할당해야 하는지 이해가 되지 않아서요? 실제로 제가 스레드내의 로컬 변수로 선언하고 동작 시켜도 정상적으로 동작을 해서요.
DLL 명시적 링크에서 파일 오류가 생기는데 해결이 안됩니다. 구글 검색이랑 여기저기 다 해봤는데 나오는 게 없어서 질문 합니다. 일단 코드 입니다. 질문 내용은 코드 밑에 다가 적어 두겠습니다. DLL 파일 이름 = Dll1.dll main 파일 이름 = dlltest.cpp 경로는 강의와 동일 합니다. main() 파일 #include <iostream> #include <Windows.h> #include <tchar.h> using namespace std; //void WINAPI DllTestFunction(int pParam); int main() { HINSTANCE Hin = ::LoadLibraryA("..\\x64\\Debug\\Dll1.dll"); DWORD Error1 = ::GetLastError(); if (Hin == NULL) { printf("falied LOADLIBARARY"); } DWORD(WINAPI * dllfun)(void) = NULL; dllfun = (DWORD (WINAPI*)(void)) ::GetProcAddress(Hin, "DllFunction"); Error1 = ::GetLastError(); std::cout << Error1 << std::endl; dllfun(); if (dllfun == NULL) { std::cout<<"failed dllfun()"<<std::endl; wprintf(_T("falied dllfun()")); return 0; } std::cout << "ddd" << std::endl; FreeLibrary(Hin); return 0; } DLL 파일 #include "pch.h" #include<stdio.h> #include<Windows.h> #include<iostream> #include<tchar.h> #pragma once extern "C" __declspec(dllexport) DWORD WINAPI DllFunction(void); DWORD WINAPI DllFunction(void); BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } DWORD WINAPI DllFunction(void) { wprintf(_T("DLL TEST: DllTestFunction(param:)")); std::cout << "failed DLLfun dllfun()" << std::endl; return 0; } 현재 증상 dllfun(GetProcAddress로 얻은 함수 주소)가 자꾸 NULL로 나와서 실행이 안됩니다. 현재까지 확인된 내용 Hin(LoadLibraryA) 모듈 핸들을 얻었는 데 NULL은 안 뜨나 디버깅을 했더니 This Program cannot be run in Dos mode 라고 나옵니다. dllfun(GetProcAddress로 얻은 함수 주소)은 NULL이 확실합니다. 밑에 코드 몇번 변경하면서 확인 됬습니다. GetLastError()을 dllfun()에 127( 지정된 프로시저를 찾을 수 없습니다."라는 오류가 생성됩니다.)이 나옵니다 현재까지 시도 경로 조정 절대경로, 상대 경로 다해봤습니다. 함수 이름 변경 extern "C" ~ 이것도 파일 양쪽에 다 넣어보고 한쪽에도 넣어보고 했습니다. 구글 검색해도 원하는 내용이 안나옵니다. Hin의 자료 형을 HMODULE, HINSTANCE 다해봤습니다. 환경변수 조정 v3에 걸려서 꺼보고 실행 exe 파일위치를 기준으로 경로 조정 빌드도 해봤는데 안됩니다. 대략 이 정도 입니다. 원인이랑 해결방법이 궁금 합니다.
안녕하세요! 프로세스 파트 마지막 강의를 듣다가 궁금한 점이 있어 질문 남겨봅니다! static 파트는 r 와 rw가 가능한 곳으로 나뉜다고 말씀해주셨고 보통 r만 가능한 영역은 문자열이 담기게 된다고 이해했습니다. rw 가 가능한 영역은 어떤 데이터기 담기는 지 알 수 있을끼요??
for(int i = 0; i < n ; ++i) 문 안에 스레드 생성시 매개변수로 &i를 주고 스레드를 생성할 경우 i 값이 변경되어 스레드에 +1 된 값이 전달되는 현상을 방지하려면 어떻게 해야 할 까요? 아마도 주소값을 주기 때문에 스레드 생성후에 i값이 변경되면서 발생한 거 같은데 해결 방법을 모르겠습니다.