从VBA访问C中的嵌套结构

问题

我有一个用C语言编写的库,并使用Visual Studio 2010编译为DLL.该DLL具有多个导出函数.使用Declare Function从Excel访问导出的函数.

我试图在程序中实现一个新功能,它需要C部分中的嵌套结构,然后从VBA访问. C代码看起来像这样.

第一结构

struct Parameter {
    double value;   
    char* label;     
    char* description;
    char* units;  
};

第二种结构

此结构用于构建另一个结构,如下所示:

struct Output {
    Parameter field_1;
    Parameter field_2;
    Parameter field_3;
};

我正在考虑从VBA访问结构的几种方法.其中一个来自像这样的虚空功能.

void Function1(Output* output_function1);

另一个是返回Output结构的函数,例如this.

Output Function2();

上面两个函数的内部结构在这一点上并不重要.我已经验证了这两个实现在C代码中都按预期工作.

问题

我无法使用Function1或Function2从VBA访问这两个结构.

我在VBA中声明了两种自定义类型.

Type Parameter
    Value as Double
    Label as String
    Description as String
    Units as String
End Type

Type Output
    Field1 as Parameter
    Field2 as Parameter
    Field3 as Parameter
End Type

对于Function1,我声明了导出的函数如下.

Declare Sub Function1 Lib "C:\Path\to\library.dll" (ByRef OutputStruct as Output)

对于Function2,以下内容.

Declare Sub Function2 Lib "C:\Path\to\library.dll" () as Output

Function2崩溃Excel和Function1给我错误vba byref参数类型不匹配.

我在这做错了什么?什么是正确的方法?

最佳答案 如果在#pragma pack(4)… #pragma pack()指令中包含结构的定义,Function1将正常工作.

https://msdn.microsoft.com/en-US/en-en/library/office/bb687915.aspx

C:

#pragma pack(4)
struct Parameter{
    double value;   
    char* label;     
    char* description;
    char* units;  
};

struct Output{
    struct Parameter field_1;
    struct Parameter field_2;
    struct Parameter field_3;
};
#pragma pack()


static char Buffer [4096];

static void Append_Field_Values (struct Parameter* field)
{
    static char b [1024];
    sprintf (b, "%f %s %s %s\n", field -> value, field ->label, field -> description, field -> units);
    strcat (Buffer, b);
}

void _stdcall Function1(struct Output* output_function1)
{
    Buffer [0] = 0;
    Append_Field_Values (&output_function1 -> field_1);
    Append_Field_Values (&output_function1 -> field_2);
    Append_Field_Values (&output_function1 -> field_3);
    MessageBox (0, Buffer, "FUNCTION1", 0);
}

VB:

Type Parameter
    Value As Double
    Label As String
    Description As String
    Units As String
End Type

Type Output
    Field1 As Parameter
    Field2 As Parameter
    Field3 As Parameter
End Type

Declare Sub Function1 Lib "E:\Serge\StackOverflow\NestedStructures\Debug\NestedStructures.dll" (ByRef OutputStruct As Output)

Dim Out1 As Output

Sub Test1()
    Out1.Field1.Value = 3.14
    Out1.Field1.Label = "ARINC 429"
    Out1.Field2.Units = "Miles and Inches"
    Out1.Field3.Description = "Read MSDN"

    Call Function1(Out1)
End Sub

《从VBA访问C中的嵌套结构》

点赞