문제

C/C++로 작성한 Windows DLL이 있습니다(내보낸 모든 함수는 'C'임).DLL은 VC++에서 잘 작동합니다.VB에서 모든 개발을 수행하는 다른 회사에 DLL을 제공했습니다.기능 연결에 문제가 있는 것 같습니다.나는 10년 동안 VB를 사용하지 않았고 설치한 적도 없습니다.무엇이 문제일까요?

나는 모든 공개 기능을 다음과 같이 선언했습니다.

#define MYDCC_API __declspec(dllexport)


MYDCCL_API unsigned long MYDCC_GetVer( void);
.
.
.

어떤 아이디어가 있나요?


마침내 오늘 이것으로 돌아와서 작동하게 했습니다.답변을 통해 올바른 방향으로 나아갈 수 있었지만 이것이 가장 도움이 되었다고 생각합니다.

http://www.codeproject.com/KB/DLL/XDllPt2.aspx

또한 문자열을 DLL 함수에 전달하는 데 몇 가지 문제가 있었는데 이것이 도움이 되었습니다.

http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml


도움이 되었습니까?

해결책

사용하여 __declspec 내보내기의 경우 함수 이름이 내보내집니다. 망가진, 즉.C++ 컴파일러가 오버로드를 해결하는 데 도움이 되는 유형 정보를 포함합니다.

VB6은 잘못된 이름을 처리할 수 없습니다.해결 방법으로 이름을 정리해야 합니다.가장 쉬운 해결책은 다음을 사용하여 DLL 파일을 연결하는 것입니다. 내보내기 정의 VC++의 파일입니다.내보내기 정의 파일은 매우 간단하며 DLL 이름과 내보낸 함수 목록만 포함합니다.

LIBRARY mylibname
EXPORTS
    myfirstfunction
    secondfunction

또한 다음을 지정해야 합니다. stdcall 호출 규칙은 VB6이 처리할 수 있는 유일한 호출 규칙이기 때문입니다.C 호출을 처리하기 위해 어셈블리 주입을 사용하는 프로젝트가 있지만 여러분은 이 어렵고 오류가 발생하기 쉬운 방법을 사용하고 싶지 않을 것 같습니다.

다른 팁

끝에 __stdcall을 추가해 보세요

#define MYDCC_API __declspec(dllexport) __stdcall

우리는 이전 VB6 앱과 상호 작용하는 일부 C++ dll을 가지고 있으며 모두 끝에 있습니다.

VB6 DLL은 항상 COM dll입니다.가능한 한 적은 단어로 예를 설명하겠습니다.아래와 같은 메소드를 포함하는 CTest라는 클래스가 있는 VB6의 ActiveX DLL 프로젝트가 있다고 가정합니다.

public function vbconcat (byval a as string, byval b as string) as vbconcat = a & b end function

VB6 프로젝트 속성에서 프로젝트 이름을 vbtestlib로 설정했으며 프로젝트를 f : proj vb6 activexdll vbtestdll.dll로 컴파일했습니다.

Windows 명령 Regsvr32 F : proj vb6 activexdll vbtestdll.dll을 사용하여 DLL을 등록해야합니다.

이제 C++ 코드:

#import "f : proj vb6 activexdll vbtestdll.dll"네임 스페이스 vbtestlib를 사용하여;

void cdialogtestdlg :: onbutton1 () {

 HRESULT hresult;
 CLSID clsid;
 _CTest *t; // a pointer to the CTest object
 _bstr_t bstrA = L"hello";
 _bstr_t bstrB = L" world"; 
 _bstr_t bstrR;
 ::CoInitialize(NULL);
  hresult=CLSIDFromProgID(OLESTR("VBTestLib.CTest"), &clsid);
  hresult= CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                               __uuidof(_CTest),(LPVOID*) &t);
  if(hresult == S_OK)
  {
     bstrR  = t->vbConcat(bstrA , bstrB);
     AfxMessageBox((char*)bstrR);
   }

}

시작하는 것이 전부입니다.

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