2008-10-02 3 views
0

현재 클라이언트 브랜딩 용으로 MFC 기반 응용 프로그램에서 DLL로 많은 코드를 포팅하고 있습니다.참조 구조가 'sticking'이 아닙니다.

나는 이상한 문제를 발견했습니다. 이러한 코드는 양 시스템에서 동일하다 :

// ... 
    CCommsProperties props; 

    pController->GetProperties(props); 
    if (props.handshake != HANDSHAKE_RTS_CTS) 
    { 
     props.handshake = HANDSHAKE_RTS_CTS; 
     pController->RefreshCommProperties(props); 
    } 

// ... in another file: 
void CControllerSI::RefreshCommProperties (const CCommsProperties& props) 
{ 
    // ... code ... 
} 

CommProperties는 상기 통신 설정 래퍼 등 직렬화하고 pController 자체는 실제 컴즈와 애플리케이션 사이의 층 유형 ControllerSI이다.

원래 MFC 버전에서는 RTS-CTS에 대한 핸드 셰이크 설정이 그대로 적용되지만 DLL 버전으로 실행하면 기능을 입력하자마자 자체를 0으로 재설정합니다. 코드는 코드의 DLL 섹션에 완전히 포함되어 있으므로 경계가 없습니다.

원본과 새로운 모듈의 주요 차이점

다양한 대화 상자가 제거 된 호출 변수와 나는이에 오후를 잃었다

제거 된 #include를 내가 정말하고 싶지 않아 더 이상 잃지 마십시오 ...

+0

왜이 질문은 "오프 토픽"으로 닫 혔습니까 ?? – augustin

+0

원래 닫았지만 주제를 벗어난 것으로 기억하지 못합니다. 어쩌면 닫는 코드를 세분화하고 이전에 닫은 모든 질문이 기본값이 아닌 '주제가 아님'으로 설정되기 전 이었을지도 모릅니다. –

답변

0

Saratv 게시 후, 나는 내가 한 일을 버리고 다시 작업 소스에서 다시 시작하기로 결정했습니다.

이번에는 작동하지만 ... 왜 구조체를 통과 시키면 변경되는지 알 수 없을 것입니다.

1

주어진 코드만으로는 무엇이 잘못되었는지 알기가 어렵습니다. 일부 일반 포인터 :

  1. 클래스/구조가 수출되지 공유하는 경우 목적은

  2. (예 : C-실행 시간으로) 초기화와 호환되지 않는 링크와 다른 바이너리 모듈 처리/수입 바르게.

  3. 클래스가 두 개 이상의 장소에 정의되어 있으며 올바른 정의가 포함되어 있지 않습니다.

특히 위의 세 가지가 모든 필드가 기본 초기화 된 값으로 다시 설정된 경우에 가장 많이 발생합니다.

하나 또는 두 개의 필드 만있는 경우 구조가 제대로 정렬되지 않을 수 있으며 필드를 재정렬해야 수정할 수 있습니다 (릴리스에서 확인).

일반적으로 사용자가 초기화 한 객체가 RefreshCommProperties()이 아닌 이유는 위의 세 가지 중 하나 일 수 있다고 가정하고 싶습니다.

0

실제로 무슨 일이 일어나는지 알아 보려면 소스 코드를 게시해야합니다. 또는 적어도 문제를 복제하는 것이 좋습니다. 불행히도 StackOverflow는 권장하지 않습니다. FTP 사이트에 코드를 게시하거나 CodeGuru와 같은 소스 코드를 게시 할 수있는 사이트로 이동할 수 있습니다.

+0

첨부 파일에 대해 UserVoice에 항목이 있지만 거부되었습니다. –

0

CCommsProperties는 서로 다른 두 위치에 정의되어 있으며 각 파일에는 고유 한 버전이 포함되어있을 수 있습니다.

이 이론을 테스트하려면 디버거에서 & props.handshake를 봐야합니다. 디버거에서 필드의 내부 및 외부에있는 주소가 다르다고 말하면 가설이 참되며 전처리 출력을 검토하여 왜 발생했는지 파악할 수 있습니다.

관련 문제