레이블이 MFC인 게시물을 표시합니다. 모든 게시물 표시
레이블이 MFC인 게시물을 표시합니다. 모든 게시물 표시

2015년 2월 6일 금요일

Dll 로딩 실패_에러코드 126

실행파일에서 사용할 dll을 만들었고, dll파일을 로딩할때, 로딩실패되었다. 에러코드는 126이었는데, 해당 에러코드가 나오는 원인은 여러가지가 있겠지만, 내가 겪은것을 기록하면, 

1. DLL을 만들때 공유 DLL에서 MFC 사용으로 컴파일
2. 실행프로그램에서 로딩시 126 에러로 실패
3. MFC DLL의 종석성을 의심하고 재배포 패키지를 설치  
4. Dependency Worker로 DLL 종석성 CHECK 
5. 재배포 패키지에는 release 모드 dll만 설치되는것이 었음.
  → 아래 그림처럼 MFC100D.DLL, MSVCR100D.DLL이 설치가 안되어있음.






















이런 문제를 예방하고자 정리하면.
◆ 디버깅 환경(개발 환경이 셋팅된 상황, VS에서 개발했으면 VS가 깔린PC)에서만 디버그 모드를 사용,
 → 배포(다른 PC에 적용)할때는 릴리즈 모드로 적용
 → 개발 환경에 대한 재배포 패키지까지 같이 제공.
 ◆ 프로그램 또는 DLL 배포 시 종석성 CHECK 필수로 진행

2014년 11월 13일 목요일

CAsyncSocket의 OnReceive 함수에서 패킷을 받을 때 주의사항

 Socket 통신을 이용해서 프로그래밍을 할때, 패킷 정보에 앞에 헤더(id, 패킷의 길이)를 넣어서 많이 사용한다. 처음에는 패킷을 받을 OnReceive 함수에서 Receive를 두번 호출하여, 먼저 헤더를 받고, 헤더에서 패킷길이 만큼 받게 사용하였다. 이렇게 했을 경우 10ms에 한번 패킷을 보내면, 100000번 내외에서 랜덤하게 패킷을 못받게 되는 현상이 발생한다. OnReceive가 CAsyncSocket 클래스의 가상함수 인데, 여기서 Receive를 두번이상 호출 하면 안정성 보장이 안된다고 한다.
 이렇게 사용 안하려면, 패킷을 받기전에 패킷의 길이 부터 파악할 수 있어야 하는데, afxsock.h에서는  패킷의 길이를 파악할 수 있는 함수(IOCtl)를 제공한다. 실제 사용은 아래와 같이 하면된다.
[-] Collapse
void CClientSocket::OnReceive(int nErrorCode)
{
    // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
    //Receive를 분할 수신하면... 랜덤하게 100000번 내외에서 못받음 현상발생
    DWORD dwReadLen;
    IOCtl(FIONREAD, &dwReadLen); //패킷 길이를 먼저 파악하고
    char* szReceBuff = new char[dwReadLen];
    int nReadLen = 0;
    nReadLen = Receive( szReceBuff, dwReadLen ); //한번에 다받아야 한다..

    int header[2];
    memcpy(header,szReceBuff,sizeof(int)*2); //한번에 받고나서 헤더를 분리하고

    if(header[0]==Command::Grab) //헤더의 내용(id,길이)에 따라..
    {
        memcpy(&GrabInfo,&szReceBuff[2*sizeof(int)/sizeof(char)],header[1]);
        //받은후 작업 추가.
    }
    delete szReceBuff;
    CAsyncSocket::OnReceive(nErrorCode);
}

2014년 10월 20일 월요일

CFile 클래스 동일 파일 열기

파일 한개를 여러 프로그램이 열어야 할 경우가 생겼다. 단순히 read mode로 열면 열릴줄 알았는데 에러가 났다. 아래처럼 해주어야 동일 파일을 여러 프로그램이 열수 있다. CFile file; file.Open(strTemp, CFile::modeRead||CFile::shareDenyNone, &ex) Msdn에는 아래처럼 설명하고 있다. CFile::shareDenyNone 공유 제한 사항이 없습니다. Api 함수 중 copyfile 이 있는데 이 함수는 파일이 먼저 열려있으면, 복사를 실패한다. 하지만 디버그 모드에서도 에러를 띄우지 않는다. 때문에 복사가 되는줄 알고 파일을 확인해보면 파일이 복사되지 않았다. BOOL WINAPI CopyFile( _In_ LPCTSTR lpExistingFileName, _In_ LPCTSTR lpNewFileName, _In_ BOOL bFailIfExists );