0

アンマネージDLLをラップする既存のVBクラスから構築したVBクラスライブラリがあります。VBクラスライブラリには、DLL関数と、DLL関数に関連付けられたさまざまな構造体およびタイプが含まれています。

C#プロジェクトでクラスlibを使用していますが、クラスlibの関数の1つで、引数として構造体を渡す必要があります。これは私が問題にぶつかっているところです。

DLLのVBコードは次のとおりです。

Declare Auto Function CtSetVRegister Lib "Ctccom32v2.dll" _
        (ByVal ConnectID As Integer, ByRef Storage As CT_VARIANT) As Integer

VB構造体は次のとおりです。

<StructLayout(LayoutKind.Sequential, Pack:=1)> _
Public Structure CT_VARIANT
    Dim vRegister As Integer          'Variant Register desired
    Dim type As Integer               'Format want results returned in
    Dim precision As Integer          'Precision desired for floating point conversions
    Dim flags As Integer              'Specially defined flags, 0 for normal, (indirection, etc.)
    Dim cmd As Integer                'Special commands, 0 for normal operation
    Dim taskHandle As Integer         'Alternate task handle for local task register access, 0 = default public
    Dim slength As Integer            'Length of bytes returned in stringVar, not include null
    Dim indexCol As Integer             'Column (X) selection, base 0
    Dim indexRow As Integer             'Row (X) selection base 0
    Dim IntegerIntVar As Integer         '32 bit signed integer storage
    Dim FloatVar As Single         '32 bit float
    Dim DoubleVar As Double        '64 bit double in Microsoft format
    <MarshalAs(UnmanagedType.ByValArray, SizeConst:=223)> _
    Public stringVar() As Byte         'null terminated ASCII string of bytes (1 to 224)
End Structure

私が書いているC#メソッドでは、構造体に必要な値を設定してから、それらをDLL関数に渡す必要があります。

private void btnWriteVReg_Click(object sender, System.EventArgs e) 
{
        int results;
        CTC_Lib.Ctccom32v2.CT_VARIANT Var;            
        Var.vRegister = int.Parse(txtVRegToRead.Text);
        Var.cmd = 0;
        Var.flags = 0;
        Var.FloatVar = 0;
        Var.IntegerIntVar = 0;
        Var.DoubleVar = 0;            
        Var.precision = 6;            
        writeStatus.Text = "";

        Var.type = CTC_Lib.Ctccom32v2.CT_VARIANT_INTEGER;
        Var.IntegerIntVar = Convert.ToInt32(txtVRegVal.Text);            

        Var.taskHandle = 0;
        results = CTC_Lib.Ctccom32v2.CtSetVRegister(CTconnection,ref Var);
        if ((results == SUCCESS)) 
        {
            writeStatus.Text = "SUCCESS";
        }
        else 
        {
            writeStatus.Text = "ERROR";
        }
    }

エラーが発生します:

割り当てられていないローカル変数「Var」の使用

構造体「Var」をVBクラスライブラリに適切に渡す方法について少し戸惑っています。

4

2 に答える 2

1

初期変数

CTC_Lib.Ctccom32v2.CT_VARIANT Var = new CTC_Lib.Ctccom32v2.CT_VARIANT();
于 2012-07-02T19:34:05.900 に答える
0

Var のインスタンスを作成する必要があります。

CTC_Lib.Ctccom32v2.CT_VARIANT Var = new CTC_Lib.Ctccom32v2.CT_VARIANT();
于 2012-07-02T19:34:21.607 に答える