월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨Windows 시스템 프로그래밍 - 기본
강사님 파일입출력(Callback함수)와 관련하여 질문 드립니다.
강의 내용중 비동기 입출력 CALLBACK 함수 사용 부분에서 OVERLAPPED 구조체와 BUFFER 를 동적할당 해야 한다고 하셨는데.하지만 비동기 I/O를 하고 있는 스레드가 마지막 부분에서 SleepEx(1, TRUE) 로 대기하고 있습니다. 즉 스레드는 해당 CALL 함수 종료 후에도 계속 존재하기 때문에 스래드의 로컬변수로 선언해서 전달해도 CALLBACK 함수에서 사용하는데는 문제가 없는거 아닌지요? (이벤트로 처리하는 부분은 스레드 변수로 처리)왜 동적변수로 할당해야 하는지 이해가 되지 않아서요?실제로 제가 스레드내의 로컬 변수로 선언하고 동작 시켜도 정상적으로 동작을 해서요.
- 해결됨Windows 시스템 프로그래밍 - 기본
dll 명시적 링크 오류 (원인 및 해결 방법이 필요 합니다)
DLL 명시적 링크에서 파일 오류가 생기는데 해결이 안됩니다.구글 검색이랑 여기저기 다 해봤는데 나오는 게 없어서 질문 합니다.일단 코드 입니다. 질문 내용은 코드 밑에 다가 적어 두겠습니다.DLL 파일 이름 = Dll1.dllmain 파일 이름 = 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 onceextern "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 파일위치를 기준으로 경로 조정빌드도 해봤는데 안됩니다.대략 이 정도 입니다.원인이랑 해결방법이 궁금 합니다.
- 해결됨Windows 시스템 프로그래밍 - 기본
static 영역의 rw 가능한 곳은 어떤 데이터가 담기는지 궁금합니다.
안녕하세요! 프로세스 파트 마지막 강의를 듣다가 궁금한 점이 있어 질문 남겨봅니다!static 파트는 r 와 rw가 가능한 곳으로 나뉜다고 말씀해주셨고 보통 r만 가능한 영역은 문자열이 담기게 된다고 이해했습니다. rw 가 가능한 영역은 어떤 데이터기 담기는 지 알 수 있을끼요??
- 해결됨Windows 시스템 프로그래밍 - 기본
TerminanteProcess 와 관련하여 질문 드립니다.
TerminateProcess가 ExitProcess 대신 사용되는 경우 DLL(동적 연결 라이브러리)에서 유지 관리하는 글로벌 데이터의 상태가 손상될 수 있다. ===> 이 부분에 대한 설명 부탁드릴 수 있는지요?
- 해결됨Windows 시스템 프로그래밍 - 기본
강사님 스레드 관련 질문 드립니다.
for(int i = 0; i < n ; ++i) 문 안에 스레드 생성시 매개변수로 &i를 주고 스레드를 생성할 경우 i 값이 변경되어 스레드에 +1 된 값이 전달되는 현상을 방지하려면 어떻게 해야 할 까요? 아마도 주소값을 주기 때문에 스레드 생성후에 i값이 변경되면서 발생한 거 같은데 해결 방법을 모르겠습니다.
- 해결됨Windows 시스템 프로그래밍 - 기본
강사님 메뉴얼 중 이것도 궁금해서 여쭤봅니다.
TerminateProcess가 ExitProcess 대신 사용되는 경우 DLL(동적 연결 라이브러리)에서 유지 관리하는 글로벌 데이터의 상태가 손상될 수 있다. ====> 어떤 내용인지 설명해 주실 수 있는지요?
- 해결됨Windows 시스템 프로그래밍 - 기본
강사님 프로세스의 IPC에서 굳이 MUTEX 가 필요할까 하는 생각이 듭니다.
강사님이 주신 예제의 뮤텍스를 보면 읽기/쓰기 동작에서는 쓰기가 먼저 일어나고 읽기가 일어나야 하기 때문에 이를 위해서는 뮤텍스 단독으로는 이러한 처리가 불가능하다고 보여지며 반드시 이벤트와 결합되어야 이러한 동작이 가능할 거 같이 보여집니다. 아울러 이벤트를 써서 구현하면 굳이 뮤텍스는 필요 없을 거 같다는 생각이 드는데 강사님 의견 부탁드립니다.
- 해결됨Windows 시스템 프로그래밍 - 기본
강사님 ExitProcess 와 TerminateProcess 에 대해 질문드립니다.
ExitProcess 관련 메뉴얼에프로세스에서 종료된 스레드 중 하나에 잠금이 있고 로드된 DLL 중 하나의 DLL 분리 코드가 동일한 잠금을 획득하려고 하면 ExitProcess 를 호출하면 교착 상태가 발생한다. 라고 되어 있는데 중요한 애기 인거 같은데 무슨 애기인지 알 수 있는지 해서요?DLL에서 ExitProcess 를 호출하면 예기치 않은 애플리케이션 또는 시스템 오류가 발생할 수 있다. DLL을 로드할 애플리케이션 또는 시스템 구성 요소와 이 컨텍스트에서 ExitProcess 를 호출하는 것이 안전한 경우에만 DLL에서 ExitProcess 를 호출해야 한다. 라고 되어 있는데 설명 부탁드릴 수 있느지요?아울러 ExitProcess 와 TerminateProcess 의 경우 프로그램이 할당한 메모리 등 자원 및 오픈한 handle 에 대한 처리는 어떻게 되는지요? 부탁드려 봅니다.
- 해결됨Windows 시스템 프로그래밍 - 기본
강사님 질문이 너무 많아 죄송합니다.
메모리를 내부적으로 64KB 와 4KB 로 관리하는 내역이 뭔지 좀 자세한 설명 부탁드릴 수 있는지요?4KB 는 시스템에서 한번에 이동하는 즉 PAGE 단위라는 것은 알고 있는데 64KB 의 의미는 정확히 이해가 좀 안가서요....또한 4Kb 를 넘어가는 메모리 요청은 한페이지를 넘어가는데 이 경우 메모리의 주소 관리 등은 어떻게 이루어 지는지 궁금합니다. 아울러 한가지만 더 여쭤보면 만약 스레드를 생성하고 대기하기도 전에 스레드가 종료되어 버리면 WaitForSingleObject는 어떻게 동작하나요?또한 SetEvent() 를 호출하여 이벤트가 signalled 상태로 변경하면 WaitForSingleObject() 를 호출하는 모든 스레드는몇번이고 Event 가 non-signalled 로 전환되기 전까지는 몇번이고 WaitForSingleObject() 를 통해 Event 를 받을 수 있게 되는 건가요?
- 해결됨Windows 시스템 프로그래밍 - 기본
비즈니스 코드는 프로세스간에 공유가 되는건지요?
개발자가 작성한 프로그램을 여러개의 프로세스로 기동할 때실행코드는 모든 프로세스가 공유하는 건지요? 만약 그렇다면 사용자 코드는 사용자 메모리에 어떻게 올라가서 어떤식으로 모든 프로세스가 공유할 수 있는건지 궁금합니다.
- 해결됨Windows 시스템 프로그래밍 - 기본
강사님 질문 드립니다.
게임개발자가 되려면 MFC 를 어느정도 알아야 하나요?게임개발자가 되려면 반드시 MFC 를 공부해야 하는지 궁금해서요...강사님의 조언 부탁드립니다.
- 해결됨Windows 시스템 프로그래밍 - 기본
동기와 비동기
다중 코어 환경에서는 os가 스레드를 처리할때 동시성과 병렬성을 무조건 다써서 처리하나요? 친화력 조절을 안한다면..1번이 그렇다라면 코어가 4개(스레드 4개)인 컴퓨터에서하나의 프로세스에서 3개의 스레드가 추가로 실행되어 총 4개의 스레드가 존재할때 추가된 3개의 쓰레드가 각각 2초짜리 입력 요청을 하나의 파일에 요청한다고 할때cpu (idle~적당히)동기 : 최소 2초 ~ 최대 6초 (block)비동기 : 최소 2초 ~ 최대 6초가 맞을까요?이렇게 볼때 비동기가 동기보다 좋은 이유가 block 되지않고 코드를 더 실행하는것 하나 뿐인가요? 이후에 다른 작업들이 더 많아지면서 비동기가 빛을 발하게 되는건가요?
- 해결됨Windows 시스템 프로그래밍 - 기본
시스템 프로그래밍에서 c와 c++
시스템 프로그램 함수 매개변수에 NULL을 사용할때 c식으로 코딩하려면 NULL이고 c++식으로 코딩하면 nullptr로 써두는게 협업에서 도움이 되나요?시스템 프로그래밍이나 소켓프로그래밍에서 scanf와 printf문,char배열을 쓰는것보다 cout,cin,endl,string을 쓰는게 성능 차이가 많이 나나요?
- 해결됨Windows 시스템 프로그래밍 - 기본
이예제 파일 어디 있나요
파일을 못 찾겠어요
- 해결됨Windows 시스템 프로그래밍 - 기본
응용편에서는 어떤 내용이 들어가나요?
강의 완강했습니다. 응용편에서는 어떤 내용이 들어가는지 알 수 있을까요?
- 해결됨Windows 시스템 프로그래밍 - 기본
64KB 단위로 파일을 읽는 것에 대해 궁금한 점이 있습니다.
안녕하세요 선생님, 동기 파일 입출력을 설명해주시면서 64KB 단위로 파일을 읽어오는 이유에 대해 말씀해주셨는데, OS가 Page들을 할당한 후에 그 Page들을 묶어서 관리하는 크기의 단위가 64KB이어서 파일에서 읽어온 데이터를 저장할 버퍼가 특정 Page의 시작 주소부터 16개의 Page에 연속 되도록 데이터를 저장하기 위함으로 이해하면 될까요?
- 미해결Windows 시스템 프로그래밍 - 기본
게임 개발자를 희망하는 학생인데 질문이 있습니다!
게임 서버 프로그래머 지망생에게 이 강의를 추천 하신다기에 수강하게 되었는데요.아직 강의 초반이지만 winapi에서 쓰이는 구조체나 함수들이 계속 등장하는 것 같은데 해당 지식들이 실제로 게임 업계 실무에서 사용되는 지식들인가요? 그렇다면 강의에 나오는 내용을 꼼꼼히 머릿속에 넣어야 하겠지만지엽적인 개념보다 큰 틀(os와 관련된 지식들)이 중요한 것이라면 직접적인 winapi 사용법 보다는 os 관련된 지식을 중점으로 공부하려고 하는데 어떤 방법을 추천하시나요?
- 해결됨Windows 시스템 프로그래밍 - 기본
비동기 Callback방식 코드 질문
#include <iostream>#include <windows.h>#include <stdio.h>#include <tchar.h> void CALLBACK FileIoComplete( DWORD dwError, DWORD dwTransferred, LPOVERLAPPED pO1){ printf("FileIoComplete() Callback - [%d 바이트] 쓰기 완료 -%s\n", dwTransferred, (char*)pO1->hEvent); //hEvent 멤버를 포인터로 전용했으므로 가리키는 대상 메모리를 해제한다. //이 메모리는 IoThreadFunction() 함수에서 동적 할당된 것들이다! delete[](char*)pO1->hEvent; delete pO1; puts("FileIoComplete() - return \n");}DWORD WINAPI IoThreadFunction(LPVOID pParam) { //메모리를 할당하고 값을 채운다. //이 메모리는 완료 함수에서 해제한다. char* pszBuffer = new char[16]; memset(pszBuffer, 0, sizeof(char) * 16); strcpy_s(pszBuffer, sizeof(char) * 16, "Hello IOCP"); // Allocate and initialize the OVERLAPPED structure. //OVERLAPPED 구조체의 hEvent 멤버를 포인터 변수로 전용한다! LPOVERLAPPED pOverlapped = NULL; pOverlapped = new OVERLAPPED; memset(pOverlapped, NULL, sizeof(OVERLAPPED)); pOverlapped->Offset = 1024 * 1024; //일부러 사이즈 작게 했습니다. pOverlapped->hEvent = pszBuffer; //pOverlapped->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // Manual-reset event //비동기 쓰기를 시도한다. //쓰기가 완료되면 완료 함수가 역호출된다. puts("IoThreadFunction() - 중첩된 쓰기 시도"); ::WriteFileEx((HANDLE)pParam, pszBuffer, sizeof(char) * 16, pOverlapped, FileIoComplete); // 함수의 주소를 쓸 수 있다. for (; ::SleepEx(1, TRUE) != WAIT_IO_COMPLETION;); { //SleepEx를 호출한 WorkerThread가 ALERTABLE_WAIT 상태가 된다/ puts("IothreadFunction() - return "); } return 0; }int tmain(int argc, TCHAR* argv[]) { HANDLE hFile = ::CreateFile(_T("TestFile.txt"), GENERIC_READ, //쓰기 모드 0, //공유 하지 않음 NULL, CREATE_ALWAYS, //무조건 생성 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, //중첩된 쓰기->비동기 쓰기 NULL); HANDLE hThread = NULL; DWORD dwThreadID = 0; hThread = ::CreateThread( NULL, 0, IoThreadFunction, hFile, 0, &dwThreadID); WaitForSingleObject(hThread, INFINITE);}강사님 위와 같이 코드를 작성해서 비동기 call back 방식으로 시도하려고 하는데, Hello IOCP가 쓰여지지 않고 종료도 되지 않는데, 뭔가 오류가 있는 부분이 있나요? 또, 자동으로 종료도 되었으면 하는데, 가능한가요? 어떻게 수정하면 좋을까요?혹시 예제 코드를 공유할 수 있다면 가능한가요? 감사합니다.
- 해결됨Windows 시스템 프로그래밍 - 기본
메모리 맵 파일강의 숙제 검사
안녕하세요 선생님. 메모리 맵 파일강의 에서 내주신 숙제를 풀어 봤는데, 혹시 검사 부탁드려도 될까요?아래의 코드가 제가 작성한 코드인데 혹시 잘못된 부분이나 고치면 좋겠다 하는 부분을 알려주시면 대단히 감사하겠습니다. 그리고 따로 질문 사항이 아래와 같이 있습니다.메모리 맵 방식이 WriteFile() 방식보다 쓰기 속도가 더 빠를까요?chunkSize를 높여서 한번에 wirte하면 더 빠르다 강의에서 하셨는데, 어떠한 기준으로 메모리 효율이나 쓰기속도를 고려한 chunkSize의 최적의 사이즈를 구할수 있을까요?항상 좋은 강의 만들어 주셔서 감사합니다!#include <iostream> #include <windows.h> // Custom deleter for HANDLE struct HandleDeleter { void operator()(HANDLE handle) { if (handle != INVALID_HANDLE_VALUE) { CloseHandle(handle); } } }; typedef std::unique_ptr<std::remove_pointer<HANDLE>::type, HandleDeleter> UniqueHandle; int main() { _wsetlocale(LC_ALL, L"korean"); const wchar_t* sourceFilePath = L"C:\\TEST\\Sleep Away.zip"; const wchar_t* targetFilePath = L"C:\\TEST\\Sleep Away - copy.zip"; // Open source file UniqueHandle hFileSource{ CreateFile(sourceFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) }; if (hFileSource.get() == INVALID_HANDLE_VALUE) { wprintf(L"Failed to open source file [ERROR CODE: %d]\n", GetLastError()); return 0; } // Open target file UniqueHandle hFileTarget{ CreateFile(targetFilePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) }; if (hFileTarget.get() == INVALID_HANDLE_VALUE) { wprintf(L"Failed to open target file [ERROR CODE: %d]\n", GetLastError()); return 0; } // Set the size of the target file to match the source file LARGE_INTEGER fileSize; GetFileSizeEx(hFileSource.get(), &fileSize); if (!SetFilePointerEx(hFileTarget.get(), fileSize, nullptr, FILE_BEGIN) || !SetEndOfFile(hFileTarget.get())) { wprintf(L"Failed to set size of target file [ERROR CODE: %d]\n", GetLastError()); return 0; } // Create file mappings UniqueHandle hMapSource{ CreateFileMapping(hFileSource.get(), NULL, PAGE_READONLY, 0, 0, NULL) }; UniqueHandle hMapTarget{ CreateFileMapping(hFileTarget.get(), NULL, PAGE_READWRITE, 0, 0, NULL) }; if (hMapSource.get() == nullptr || hMapTarget.get() == nullptr) { wprintf(L"Failed to create file mappings [ERROR CODE: %d]\n", GetLastError()); return 0; } // Constants for the operation const DWORD chunkSize = 65536; // 64 KB DWORD bytesCopied = 0; for (LONGLONG offset = 0; offset < fileSize.QuadPart; offset += chunkSize) { DWORD size = static_cast<DWORD>(min(static_cast<LONGLONG>(chunkSize), fileSize.QuadPart - offset)); // Map a chunk from the source file auto pSrc = static_cast<char*>(MapViewOfFile(hMapSource.get(), FILE_MAP_READ, 0, offset, size)); if (pSrc == nullptr) { wprintf(L"Failed to map view of source file [ERROR CODE: %d]\n", GetLastError()); break; } // Map a chunk to the target file auto pDst = static_cast<char*>(MapViewOfFile(hMapTarget.get(), FILE_MAP_WRITE, 0, offset, size)); if (pDst == nullptr) { wprintf(L"Failed to map view of target file [ERROR CODE: %d]\n", GetLastError()); UnmapViewOfFile(pSrc); break; } // Copy the chunk memcpy(pDst, pSrc, size); bytesCopied += size; wprintf(L"%I64d%%\n", offset * 100 / fileSize.QuadPart); // Unmap the chunks UnmapViewOfFile(pSrc); UnmapViewOfFile(pDst); } wprintf(L"Copy complete! The original file size is %lld bytes and %d bytes copied.\n", fileSize.QuadPart, bytesCopied); return 0; }
- 해결됨Windows 시스템 프로그래밍 - 기본
보안 객체와 (보안) 기술 21분 질문입니다.
대전제 (feat. 핸들) (강의자료) 2초에서는 프로세서가 주체라고 설명해주셨는데 왜 보안 객체와 (보안) 기술자 21분경에서는 프로세스 수준 접근 통제 부분에서 객체에 대한 dacl과 로 나와있는데요.21분경에나와있는데 객체가 의미하는게 뭔가요?