1

C++ DLL があります。配列を返すエクスポートされた関数を VBA で呼び出そうとしています。戻り値の型として SAFEARRAY を処理する必要がないように、配列を参照によって関数に渡し、関数でこの配列の値を変更することにしました。ByRefしかし、VBA 実装は、配列を渡すために使用しているにもかかわらず、変更された値を返しません。

ヘッダ:

namespace myProject
{
    class FileOperator
    {
    public:
        static __declspec(dllexport) void __stdcall testArray(long* docArray);
    };
}

実装:

#include "stdafx.h"
#include "myProject.h"

using namespace std;

namespace myProject
{
    void __stdcall FileOperator::testArray(long* docArray)
    {
        docArray[0]=303;
        docArray[1]=909;
    }
}

コンソール アプリのテスト:

#include "stdafx.h"
#include <iostream>
#include "../myProject/myProject.h"

using namespace std;

int main()
{
    long docArray[2]={0};
    myProject::FileOperator::testArray(docArray);
    cout << docArray[0] << "\n" << docArray[1];
}

VBA テスト:

Private Declare Sub testArray Lib "C:\pathToDLL\myProject.dll" _
                            Alias "?testArray@FileOperator@myProject@@SGXPAJ@Z" _
                            (ByRef docArray() As Long)


Public Sub test()

Dim docArray(1) As Long

docArray(0) = 0
docArray(1) = 0

testArray docArray
For Each x In docArray
    Debug.Print x
Next

End Sub

C++ コンソール アプリの出力は次のとおりです。

303
909

VBA アプリは次のように出力します。

0
0

testArray()関数が終了すると、配列の変更が保存されないのはなぜですか? ByRefキーワードはこれを可能にするべきではありませんか?

4

1 に答える 1

3

ByRef docArray()VB(A) 内で呼び出すときに期待どおりの意味を持ちます。変数に格納されている配列を別の配列に置き換えることができます (配列全体を置き換えることなく、渡された配列の要素を変更することもできます)。

宣言された関数の場合は、 を使用してから、引数 (最初の要素へのポインター) としてByRef docArray As Long渡します。docArray(LBound(docArray))

于 2013-10-28T20:59:21.700 に答える