2012-12-17 2 views
3

In my previous question, DLL에서 함수를 호출 할 때 오류 메시지 bad DLL calling convention이 계속 표시되는 이유를 묻습니다. 일반적인 컨센서스는 호출 규칙을 cdecl으로 변경해야한다는 것이 었습니다. 말이된다.VB6에서 래퍼 DLL/유형 라이브러리를 만드는 방법은 무엇입니까?

불행히도, 필자는 함수 선언 가져 오기에 바로 놓을 수 없습니다. 래퍼 DLL을 만들거나 DLL의 형식 라이브러리를 만들어야했습니다.

저는 VB에서 매우 익숙하지 않습니다. 직장에서의 주요 관심사는 C#이며, 오랫동안 언어로 작업 한 것은 처음입니다. 이 작업을 수행하는 방법을 정확히 모르겠습니다.

래퍼 DLL이 어떻게 도움이되는지 혼란 스럽습니다. 아마도 내 코드에서 cdecl 함수 가져 오기를 꾸밀 수 없지만 정확한 함수 가져 오기를 새 VB6 DLL로 옮긴 다음 해당 DLL을 참조하면 갑자기 작동합니까?

+0

Bob의 답변에서 중요한 점은 래퍼를 원시 코드로 컴파일하므로 "갑자기"작동한다는 것입니다. 그런 다음 주 프로그램에서 해당 래퍼 DLL을 참조하고 정상적으로 개발하고 디버깅 할 수 있습니다. – prprcupofcoffee

+0

cdel 관련 문제를 해결하기 위해 typelib을 사용할 수 없습니다. – wqw

답변

4

실제로는 this 질문이 주제에 더 좋다고 생각합니다.

"함수 선언의 수입에 바로 배치"수, 요약하면,하지만 VB6 IDE는 방법 디버그 그런 일을 알지 못합니다. 그러나 컴파일러은 잘 처리합니다. 일단 dll로 컴파일하면 주 프로젝트가 컴파일 된 기능에 액세스 할 수 있습니다.

아마도 이러한 DLL을 DLL로 이동하는 방법을 묻는 중입니까? 이 경우 "ActiveX Dll"유형의 새 프로젝트를 만들어야합니다. PwrUSB와 같은 이름을 지정하십시오. 다음으로 PwrUSBApi와 같은 클래스에 클래스를 추가합니다 (또는 기본/빈 값이 제공된 경우 이름을 바꿉니다). 그런 다음 속성 창에서 클래스를 GlobalMultiUse로 설정합니다. 모듈이라고 MDeclares, 귀하의 선언의 모든 드롭 :

위로 PwrUSBApi 클래스의
'from your other post... 
Public Declare Function InitPowerDevice CDecl Lib "PwrDeviceDll.dll" (ByRef firmware() As Byte) As Long 

:

'forward your calls to the dll 
Public Function InitPowerDevice (ByRef firmware() As Byte) As Long 
    InitPowerDevice = MDeclares.InitPowerDevice(firmware) 
End Function 

당신은 API에서 더욱 완벽하게 갖춘 개체 모델을 만들 수 있습니다,하지만 난 좋겠 모든 API를 분류 할 때까지이 간단한 래퍼로 시작하십시오.

오 그래, 다시 기본 프로젝트에서 당신은 새로운 래퍼 PwrUSB.dll 프로젝트 메뉴에서 참조를 추가 할 것입니다. 그런 다음 코드에서 다음과 같이 사용하십시오.

Dim numOfDevices as Long 
Dim firmware() As Byte 
Redim firmware(0 to 31) 
numOfDevices = PwrUSB.InitPowerDevice(firmware) 

행운을 빈다.

+0

고마워, 그것은 나를 위해 일했다. 방금 대신 VarPtr (Array (0))을 사용하여 바이트 배열에 포인터를 전달해야했습니다. –

1

VB6의 래퍼 DLL은 CDecl 데코레이터 또는 DLL의 함수 시그니처를 처리하기 위해 만든 typelib을 사용해야합니다.

VB6 래퍼를 만드는 유일한 이점은 VB6 IDE에서 호출 프로그램을 쉽게 디버깅 할 수 있다는 것입니다. 여기서 CDecl은 아무런 효과가 없습니다. 래퍼는 작아서 한 번 네이티브 코드 DLL로 만들어 CDecl을 효과적으로 만듭니다.

자세한 내용은 다른 스레드를 참조하십시오. 나는 당신의 진짜 문제가 당신이 올바른 종류의 주장을 전달하지 않는다고 의심합니다.

관련 문제