Проблема при вызове VB6 родной DLL из проекта VB.net - PullRequest
0 голосов
/ 12 января 2012

У меня есть проект vb6, в котором я использую библиотеку dll для выполнения некоторых задач. Для этого я добавляю модуль, который объявляет все функции этой библиотеки, такие как:

Declare Function myFunction Lib "abcdapi.dll" (ByVal hVar1 As Long, ByVal hVar2 As Long) As Long

Когда я вызываю эту функцию (и многие другие подобные), я могу выполнить эту работу, и возвращается правильный длинный указатель. Но когда я пытаюсь сделать то же самое с помощью VB.net (импортируя ту же библиотеку, используя dllimport и вызывая ту же функцию), я не получаю результата. хотя он возвращает некоторый указатель, но это не дает правильного результата.

Private Const ABCD As String = "abcdapi.dll" 
<DllImport(ABCD)>

Public Shared Function myFunction(ByVal hVar1 As IntPtr, ByVal hVar2 As IntPtr) As IntPtr
End Function

Когда я пытаюсь вызвать вышеуказанную функцию, она не работает. Я даже попытался создать dll в своем проекте vb6 с помощью функции и попытался использовать ключевое слово import для вызова этой новой dll, но это тоже не сработало. В чем может быть проблема и как мне заставить это работать.

1 Ответ

1 голос
/ 12 января 2012

Документы, на которые вы ссылались, показывают:

TM1IMPORT TM1_BOOL TM1API TM1ValBoolGet(TM1U hUser, TM1V vBool );

Возможно ли, что TM1U и TM1V определены как 32-битные типы данных в этом API, и вы выполняете свой код .NET на 64-битной машине, что делает IntPtr 64-битным типом данных? (Если API поставляется с заголовочными файлами C, вы можете увидеть, как определяются эти типы данных). Попробуйте перекомпилировать код .NET в «x86» и попробуйте снова.

Я только что скопировал этот код из вашего комментария выше:

вызов функции ниже:

ibOK = TM1ValBoolGet(hUser, voTemp) 

В VB.net: <<< Я полагаю, здесь вы имели в виду VB6 </p>

Declare Function TM1ValBoolGet Lib "tm1api.dll" (ByVal hUser As Long, ByVal vBool As Long) As Integer 

В vb.net:

<DllImport(TM1APIDLL)> Public Shared Function TM1ValBoolGet(ByVal hUser As IntPtr, ByVal vBool As IntPtr) As Integer 
End Function 

Возможно, это опечатка, но этот тип возврата в вашем VB6 отличается от типа в VB.NET. Целое число VB6 - это 16 бит, а целое число в VB.NET - 32 бита.

...