Почему C# пустой переведенный как Пустой в VB6 вместо Ничего

У меня есть приложение C# та ссылка VB6 dll. Когда я передаю пустой указатель от C# в функцию VB6 dll, пустой указатель переводится как значение, Пустое (значение) в VB6 вместо Ничего (объект). Например:

 // function in vb6 dll that referenced by c# app
 Public Sub TestFunc(ByVal oValue As Variant)
 {
   ...
   if oValue is Nothing then
     set oValue = someObject
   end if
   ...

 }

 // main c# code
 private void Form1_Load(object sender, EventArgs e)
 {
    object testObject = new object();
    testObject = null;
    TestFunc(testObject);
 }

Когда я передам объект (не пустой) тогда, он будет передан в VB6 как объект. Но когда пустой указатель передал в vb6, это становится Пустым типом значения вместо типа объекта Ничто. Кто-либо знает почему? и есть ли так или иначе, я могу вызвать пустой указатель как Ничто в VB6 при передаче из c# приложения?

Большое спасибо.

15
задан MarkJ 15 January 2010 в 09:22
поделиться

5 ответов

Причина, вероятно, это функция BYVAL . NULL , вероятно, маршал в вариант ValueType, который как можно более «нулевым».

3
ответ дан 1 December 2019 в 04:34
поделиться

Так как вы не должны изменять функции в VB DLL, как насчет добавления одного?

Public Sub TestFuncEx(ByVal oValue As Variant)
{
   If IsEmpty(oValue) Then
    TestFunc(Nothing)
   Else
    TestFunc(oValue)
   End If
}

, по-видимому, это будет работать как 1), это не является функцией, поэтому есть Нет возвращаемого значения и 2) вы проходите по значению, поэтому он не модифицирует сам объект.

3
ответ дан 1 December 2019 в 04:34
поделиться

Попробуйте:

Public Sub TestFunc(ByVal oValue As Variant)
 {
   ...
   If oValue Is Nothing Then
     Set oValue = someObject
   ElseIf IsEmpty(oValue) Then
     Set oValue = someObject
   End If
   ...

 }

Редактирование - И я согласен с ответом Сандера Райкена о том, почему возвращается пустота вместо нулевой

2
ответ дан 1 December 2019 в 04:34
поделиться

Больше информации, чем ответа. Я только что запустил эту программу VB6 для подтверждения того, что Ничего не может быть передано ByVal . Может быть.

Private Sub Form_Load()
  Call TestSub(Nothing)
End Sub
Private Sub TestSub(ByVal vnt As Variant)
  Debug.Print VarType(Nothing)
  Debug.Print VarType(vnt)
  If vnt Is Nothing Then Debug.Print "vnt Is Nothing"
  If IsEmpty(vnt) Then Debug.Print "vnt Is Empty"
End Sub

Я получил следующий вывод. Обратите внимание, что 9 - это vbObject и указывает на Вариант, содержащий ссылку на объект.

 9 
 9 
vnt Is Nothing

Я не тестировал перемещение TestStub в другой компонент, но думаю, что это все равно сработает. Поэтому я думаю, что .NET-маршрутизация на COM могла бы сработать лучше.

5
ответ дан 1 December 2019 в 04:34
поделиться

Поскольку параметр для метода VB6 является Вариантом, вы должны тестировать на предмет Nothing, Missing и Empty, потому что они являются возможными "не значением или объектом", которые может быть передан, когда реальное значение или объект недоступны.

Отвечая на ваш вопрос, я думаю, это потому, что Variant в VB6 по умолчанию имеет значение Empty, если ваш параметр был типа Object, в вашем случае ничего не будет передано.

Вы можете попробовать передать Nothing из VB.Net и посмотреть, что произойдет. Если Nothing сохраняется в VB6 DLL, вы знаете, что его можно передать, и найдете ответ, посмотрев на код IL.

0
ответ дан 1 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: