
VC++初心者です。よろしくお願いします。
VC++2008ExpressでWindowsアプリケーションのDLLを作成してみました。
Excel2007VBAにて、そのDLLを呼び出して関数を使用したいのですが
VBAの配列を参照渡しで渡すと、配列のデータをうまく渡せません。
コードは以下の通りです。
配列ではないデータはうまくいきますが。。。
配列の場合はもっと他に必要なことがあるのでしょうか?
よろしくお願いします。
//VC++ DLLコード
#include <windows.h>
int APIENTRY Add(int[] a)
{
return a[0] + a[1] ;
}
'''VBAのコード
Private Declare Function Add Lib "TEST_DLL.dll" (ByRef a() As Integer) As Integer
Dim a(1) As Integer
Sub test()
a(0) = 1
a(1) = 2
MsgBox (Add(a))
End Sub
メッセージボックスには3が表示されるはずですが
変な数字に化けてしまいます。
どなたか、ご存知の方、よろしくお願いします。
No.1ベストアンサー
- 回答日時:
CPPファイルでコンパイルしているなら extern ”C"でCPPの自動命名を抑制したほうがいいと思います
VBAのIntegerは16ビットなので C++側の受けは shortにしないといけません
VBA側をC++に合わせるなら 変数を Longにします
またVBA側のDeclare宣言を
' C++側が intなら
Private Declare Function Add Lib "Test_DLL.dll" ( a as Long ) as Long
' C++側が shortなら
Private Declare Function Add Lib "Test_DLL.dll" ( a as Integer ) as Integer
といった具合にします
呼び出し方法は
MsgBox( Add( a(0) ) )
といった具合に 先頭要素を引数に渡しましょう
ありがとうございます。
Declare宣言と先頭要素を渡すという点がおかしかったんですね。
うまくいきました。
相当、悩んでおりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでMODE関数をつくる
-
構造体配列内の文字列検索のよ...
-
C#,繰り返し処理での最大値の取...
-
レコードセットの中身を配列に...
-
VBA 変数名に変数を使用したい。
-
C#で作成したdllをVBScriptで使...
-
スロットマシンの判定方法(VB...
-
2つ目のレコードの値を取得す...
-
c言語で自分のホームディレク...
-
【ExcelVBA】値を変更しながら...
-
アクセス ステータスバーの文...
-
「テーブルに主キーがありませ...
-
他のMDBのテーブルに追加したい
-
VBからID3タグをいじる方法
-
COBOLのコーディングについて
-
エクセル・グラフの 横軸に値を...
-
Access :ALTER TABLE で作成...
-
DataGridの全行編集状態での行追加
-
INT64対応のprintf系関数はあり...
-
oo4oによるBLOBデータ取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
エクセルでXY座標に並べられた...
-
vba フィルター 複数条件 3つ以...
-
配列のペースト出力結果の書式...
-
OutOfMemoryExceptionの回避策...
-
配列の中の最大値とそのインデ...
-
複数のtextboxの処理を一括で行...
-
Dir関数で読み取り順を操作でき...
-
VB6からの移行したいけど、VB.N...
-
COBOLの基本的な事なので...
-
構造体配列の特定のメンバーをF...
-
大量の変数を定義するにはどう...
-
EXCEL VBAの課題です
-
Redim とEraseの違いは?
-
VB.NETの配列にExcelから読み込...
-
VBAでMODE関数をつくる
-
VB.NETにて、構造体へデータを...
-
1ビットごとの配列を作りたい
-
VBAで配列引数を値渡しできない...
おすすめ情報