2009-12-21 4 views
2

하드웨어 이벤트에 대한 콜백을 설정하는 기능이있는 VB6에서 사용할 타사 COM + DLL에 문제가 있습니다. 그러나 VB.NET을 사용하고 있는데 AddressOf는 이제 COM + DLL의 setCallback 함수를 사용할 수 없다는 의미의 정수 타입 대신 참조 유형을 반환합니다.VB6 DLL은 콜백을 정수로 사용하며 VB.NET에는 델리게이트 참조 형식이 필요합니다.

이 문제를 해결할 수있는 방법이 있습니까 (VB6에서 일종의 래퍼를 개발할 수 없습니까?) 또는이 기능을 사용하려면 다른 타사 DLL을 찾아야합니까? 참고로 Logitech G15 (v2) 키보드의 LCD에 액세스하려고합니다.

참조를 들어

, 여기에 setCallback 기능과 콜백의 프로토 타입 자체입니다 :

Public Sub setCallback(funcAddr As Integer) 
Public Sub LCDbuttonPress(ByVal butStates As Integer) 
+0

콜백 프로토 타입을 알고 있으면 도움이 될 것입니다. –

+0

Public Sub setCallback (정수로 funcAddr) Public Sub LCDbuttonPress (ByVal butStates As Integer) – Sukasa

+0

그래, 정말 추가해야합니다. 죄송합니다! – Sukasa

답변

3

이처럼 setCallback 기능을 선언하는 경우 내 생각 :

Public Sub setCallback([MarshalAs(UnmanagedType.FunctionPtr)]funcAddr as function) 

나는 VB 사람이 아니에요 , 그래서 나는 정확한 구문을 모른다. 하지만 기본 아이디어는 VB.Net에서 프로토 타입을 대리자로, 심지어 올바른 형식의 대리자로 선언한다는 것입니다. 그런 다음 MarshalAs 특성을 사용하여 마샬링 코드에이를 상대방의 함수 포인터 (실제로 정수)로 처리하도록 지시합니다. C#에서 콜백을 C++ 코드에 전달하기 위해이 작업을 수행했지만 정상적으로 작동합니다.

는 C#의 경우이 들어

public delegate int MyProgress(double dPercentComplete); 
... 
int WaitWithProgress([MarshalAs(UnmanagedType.FunctionPtr)]MyProgress pfn); 

HRESULT __stdcall WaitWithProgress (long pfn, int * pRetVal); 

참고로 집의 C++ 측에 의견을 표시합니다. 이 문제에 대한 실제 해결책은 Marshal.GetFunctionPointerForDelegate()으로 밝혀졌습니다. 그리고 이것에 관한 문서를주의 깊게 읽으십시오. 이 메서드를 사용하는 경우에는 위임자가 이전에 가비지 수집되지 않았는지 확인해야합니다. setCallback(NULL)

+0

여기의 문제는 setCallback이 DLL의 함수이기 때문에 함수 정의 나 함수 정의를 변경할 수 없다는 것입니다. – Sukasa

+0

콜백을 변경하지 않고 VB.NET에서 볼 수있는 프로토 타입 *을 변경하는 중입니다. 그런 다음 MarshalAs를 사용하여 VB.NET에서 VB6이 보는 것을 변환하는 방법을 설명합니다. –

+0

존 : 내가 말할 수있는 한, VS2008은 DLL에서 setCallback *에 대한 프로토 타입을 가져오고 있습니다. 그래서 내가 말하고자하는 것은 MarshalAs 매개 변수가있는 콜백을 그곳에서 재 선언 할 수 없다는 것입니다 . 내가 틀렸다면, 사과하기가 어렵다. – Sukasa

관련 문제