0

これは前の質問のフォローアップです。一部の Vb.net コードを C# に変換しようとしています。com オブジェクトが作成され (atlDirectorObject.atlDirector)、パラメーターによって別の com オブジェクト (atl3270Tool) を作成するために使用されます。atl3270Tool は C# バージョンで作成されません。オブジェクト配列を介して 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<<<<<<<<<
4

1 に答える 1

0

ハンスは正しいです。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
于 2012-06-04T19:18:08.363 に答える