문제

이것은 NLOG C ++ API 사용과 관련이 있다고 생각합니다 (그리고 NLOG 포럼에서의 내 질문은 여기); 여기서이 질문을하는 목적은 더 많은 청중을 내 문제에 데려오고 VB6 IDE의 특정 시나리오를 구축하지 못한 뒤에 더 일반적인 아이디어를 얻는 것입니다.

간단히 말해서, 내가 가진 문제는 NLOG의 C C ++ API (NLOGC.DLL에 정의 된)를 호출하는 관리되지 않은 C ++ 구성 요소를 참조하는 VB6 구성 요소를 구축하는 데 어려움이 있다는 것입니다. 컴파일 시간 동안 빌드 문제가 발생하지 않으며, 바이너리가 구축 될 때 발생하여 일종의 링커 유형 문제임을 시사합니다. VB6 바이너리가 어떻게 생성되는지에 대해 충분히 알지 못합니다. VB6 바이너리는 생성되지만 부패한 직후에 손상되고 충돌됩니다.

VB6과 비슷한 경험이있는 사람이 있습니까 (NLOG 또는 C ++와 관련이 없음)?

편집 :이 모호한 문제에 대한 모든 응답에 감사드립니다. 불행히도 여전히 진전이 없습니다. 내가 이것을 게시 한 이후의 내 연구 결과 :

  1. 컴파일 옵션 이이 문제에 도움이되지 않는 것처럼 보이지 않습니다.
  2. 'blank'vb6 프로젝트의 NLOG 지원 C ++ 구성 요소에 대한 참조를 추가해도 충돌하거나 이상한 빌드 문제가 발생하지 않습니다. 따라서 '기본'VB6 문제가 아니며 NLOG와 다양한 구성 요소와 다른 참조 구성 요소가 사용하는 3 자 라이브러리 사이의 상호 작용과 관련된 문제 일 수 있습니까?
  3. C ++ 통화 규칙의 경우 : NLOG 지원 C ++ 구성 요소는 이러한 규칙을 준수하는 한, NLOG API 호출을하지 않는 한 VB6에서 참조 할 때 실제로 잘 작동합니다. nlogc.dll 자체가 VB6 준수 여부는 확실하지 않지만 API 호출이 C ++ 구성 요소에서 만들어지기 때문에 비 물질적이라고 생각했을 것입니다. VB6은 C ++ 구성 요소가 참조하는 내용을 알거나 신경 쓰지 않아야합니다 (이것은 이것에 대한 나의 이해가 ...)

edit2 : 빌드 중에 얻은 오류 메시지는 "로드 중 오류. 자세한 내용은"xxx "를 참조하십시오." 로그 파일을 가져 오면 "xxx를로드 할 수 없습니다". 흥미롭게도, 해당 특정 제어에 대한 모든 참조는 해당 특정 프로젝트에서 사라져 다시 빌드하려고하면 컴파일 오류가 발생합니다.

도움이 되었습니까?

해결책

관리되지 않은 C ++ 코드에서 NLOG의 COM 인터페이스 (nlog.cominterop.dll)를 사용하여 문제를 해결했습니다. C C ++ API만큼 쉽지는 않지만 적어도 VB6 구성 요소가 충돌하지 않습니다.

다른 팁

나는 일부를 조정하려고 노력할 것이다 엮다 에서 발견 된 옵션 프로젝트, 속성 메뉴, 엮다 패널이 무엇이 잘못되고 있는지에 대한 추가 힌트를 생성하는지 확인합니다.

예를 들어 실행 파일을 컴파일하는 경우 P 코드 보다는 기본 코드 스타트 업에서 여전히 충돌합니까?

컴파일 된 바이너리를 실행할 때 어떤 오류 메시지가 표시됩니까?

컴파일러/링커가 문제인지 의심 스럽습니다. VB6 프로젝트의 프로젝트 참조는 최종 실행 파일에 연결되어 있지 않습니다. VB6의 프로젝트 참조는 실제로 COM 유형 라이브러리에 대한 참조입니다 (.dll 또는 기타 이진 파일 유형에 포함되거나 포함되지 않을 수도 있음). 프로젝트 참조는 주로 두 가지 목적을 제공합니다.

  1. IDE는 객체 브라우저 (및 Intellisense 드롭 다운)에 표시되는 참조 유형 라이브러리에서 유형 정보를 추출합니다.

  2. 컴파일 타임에 컴파일러는 인스턴스화하는 각 클래스의 CLSID를 포함하여 참조 된 라이브러리에 저장된 유형 정보를 추출 하고이 데이터를 실행 파일에 포함시킵니다. 이를 통해 실행 파일은 참조 한 라이브러리에 포함 된 클래스 인스턴스를 만들 수 있습니다.

컴파일 된 바이너리는 참조 된 라이브러리의 코드에 링크되지 않으며 참조 된 라이브러리의 파일 이름도 포함되어 있지 않습니다. 최종 실행 파일에는 런타임에 COM 객체를 인스턴스화하는 데 필요한 CLSID 및 기타 유형 정보 만 포함됩니다.

VB6 컴파일 프로세스에서 문제가되지 않고 문제가 NLOG 또는 코드에서 호출하는 방식에 문제가있을 가능성이 훨씬 높습니다.

링커 문제라고 생각되면 같은 방식으로 충돌해야합니다.

  1. 새로운 표준 프로젝트 만들기 (모든 종류의)
  2. 새 모듈을 추가하고 "선언"-진술을 복사하십시오.
  3. 엮다

충돌하지 않으면 다른 것입니다.

오류에 대한 정확한 설명이나 무슨 일이 일어나고 있는지에 대한 스크린 샷에 도움이됩니다.

확인해야 할 한 가지는 Nlogc.dll 또는 C ++ DLL이 어디에나 올바른 통화 규칙을 정의하는 곳입니다. 기본적으로 DLL 함수 이름을 엉망으로 만들거나 stdcall 호출 컨벤션 외에는 아무것도 사용할 수 없습니다. C ++ DLL 이이 두 가지를 염두에두고 생성되지 않은 경우 VB6에서 작동하지 않습니다.

전화 컨벤션에 관한 MSDN 기사.

"제어 XXX를로드 할 수 없음"오류는 현재 사용되는 것과는 다른 버전의 .ocx에서 생성 된 .oca 파일로 인해 발생할 수 있습니다. 이 경우 .oca 파일을 삭제하면 도움이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top