C# 在C中使用另一个com对象创建com对象

C# 在C中使用另一个com对象创建com对象,c#,.net-3.5,late-binding,C#,.net 3.5,Late Binding,这是上一个问题的后续问题。我正在尝试将一些Vb.net代码转换为C。一个com对象被创建为atlDirectorObject.atlDirector,它用于通过参数创建另一个com对象atl3270Tool。未在C版本中创建atl3270Tool。试图通过对象数组引用atl3270Tool是否走错了路线 'working vb code Dim atl3270Tool Dim ErrMsg As String Dim atlDirectorObject = CreateObject("atlDi

这是上一个问题的后续问题。我正在尝试将一些Vb.net代码转换为C。一个com对象被创建为atlDirectorObject.atlDirector,它用于通过参数创建另一个com对象atl3270Tool。未在C版本中创建atl3270Tool。试图通过对象数组引用atl3270Tool是否走错了路线

'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<<<<<<<<<

汉斯是对的。最好在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

是的,你做错了。调用后使用atl3270Tool=p[5]。你必须使用CopyBack参数。当我建议使用vb.net编写此代码时,我当然不是那个意思。好吧,我遇到了更多的麻烦。我正在尝试使用带有copy back的newlatebinding.latecall方法来使用atl3270Tool,该对象与我最初创建的对象相同,用于从参数中获取一些数据。当我在我想要的两个参数上设置copy back=true时,无效被调用方将失败。来自HRESULT的异常:0x80020010 DISP_E_BADCALLEE。如果我在其他3个参数中的一个上设置true,则不会出错。汉斯,如果你对我坚持用C语言做这件事不太失望的话,我会很感激的。屏幕文本应该是空的,而不是字符串。空的