2012-06-04 3 views
0

Это результат предыдущего вопроса. Я пытаюсь преобразовать код Vb.net в C#. Создается объект com (atlDirectorObject.atlDirector), и он используется для создания другого объекта com (atl3270Tool) по параметру. atl3270Tool не создается в версии C#. Я иду по неправильному пути, пытаясь ссылаться на atl3270Tool через массив объектов?Создание объекта com с другим объектом com в C#

'working vb code 
Dim atl3270Tool 
Dim ErrMsg As String 
Dim atlDirectorObject = CreateObject("atlDirectorObject.atlDirector") 
atlDirectorObject.CreateTool("3270", 1, True, True, 0, atl3270Tool, ErrMsg) 
'atl3270Tool is working com object at this point = success 

//non-working c# code 
object atl3270Tool = null; 
string ErrMsg = null; 
object atlDirectorObject = Activator.CreateInstance(Type.GetTypeFromProgID("atlDirectorObject.atlDirector")); 
//atlDirectorObject is a com object now 
//attempt to reference atl3270Tool inside an object array 
object[] p = { "3270", 1, true, true, 0, atl3270Tool, ErrMsg }; 
Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateCall(atlDirectorObject, null, "CreateTool", p, null, null, null, false); 
//>>>>>>>>atl3270Tool is still null at this point<<<<<<<<< 
+0

Да, вы делаете это неправильно. Используйте atl3270Tool = p [5] * после * вызова. И вы должны использовать аргумент CopyBack. Когда я советовал использовать vb.net для написания этого кода, я, конечно же, не имел в виду * это *. –

ответ

0

Hans is correct. Лучше всего это сделать в vb.net. Но тем, кто решил сделать это на C#, вот ваше решение.

object atl3270Tool = null, ErrMsg = null; 
    object atlDirectorObject = Activator.CreateInstance(Type.GetTypeFromProgID("atlDirectorObject.atlDirector")); 
    object[] p = { "3270", 1, true, true, 0, atl3270Tool, ErrMsg }; 
    object[] p2 = { "xxxx", "", "xxxxxxxxxx", ErrMsg }; 
    Boolean[] cb = new Boolean[7]; 
    cb[5] = true; //set array index of atl3270Tool to true 
    Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateCall(atlDirectorObject, atlDirectorObject.GetType(), "CreateTool", p, null, null, cb, false); 
    atl3270Tool = p[5]; 
    Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateCall(atl3270Tool, atl3270Tool.GetType(), "ShowScreen", p2, null, null, null, false); 
// add code to release com objects 
+0

Хорошо, у меня больше проблем. Я пытаюсь использовать метод newlatebinding.latecall с копией, чтобы использовать «atl3270Tool» (тот же самый объект, который я создал для начала), чтобы захватить некоторые данные из параметра. Когда я вернул копию = true по 2 параметрам, я хочу, чтобы она завершилась неудачей («Недействительный вызов» (Исключение из HRESULT: 0x80020010 (DISP_E_BADCALLEE)) ». Это не ошибка, если я верю в один из трех других параметров. Ганс, если ты не слишком расстроен тем, что я настаиваю на том, чтобы делать это на C#. Я был бы признателен за какое-то направление. – Theo

+0

ScreenText должен быть нулевым, а не string.empty – Theo

Смежные вопросы