ここから本文です

Excel VBAでの構造体ポインタを引数にする方法について質問です。 C++から作成し...

hir********さん

2016/12/2711:35:14

Excel VBAでの構造体ポインタを引数にする方法について質問です。
C++から作成したDLL関数(DLLFunc)をコールしたいのですが、
引数が構造体(HOGE)へのポインタ渡しのため、どのように渡したら

よいかわかりません。
下記のように配列を用意してVarPtr()でByVal渡しにして見たのですが、
「DLLが正しく呼び出せません」のエラーが出てしまいます。

DLL側をいじることはできないので、VBA側でなんとかするしかないのですが、どのようにすれば良いか教えていただけませんでしょうか?

■DLL(C++)側
typedef struct
{
BYTE aaa;
BYTE bbb[4];
BYTE ccc[4];
BYTE ddd[12];
BYTE eee[4];
BYTE fff[16];
} HOGE;

BOOL DLLFunc(BYTE * );

■VBA側
Declare Function DLLFunc Lib "DLL1.dll" (ByVal src As Long) As Boolean

Sub Function1()
Dim buff(40) As Byte
Dim result As Boolean

result = DLLFunc(VarPtr(buff(0)))

End Sub

閲覧数:
914
回答数:
4

違反報告

ベストアンサーに選ばれた回答

nao********さん

2016/12/3007:46:28

Excelから DLLの関数を呼び出す場合は、.NET Frameworkの C#から COM化してExcelでDLLを参照して呼び出す方法があります。

VBAから扱えるDLLをC#で書いてみる。
https://www.ka-net.org/blog/?p=5464

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

kum********さん

2016/12/3108:22:36

DLL関数の呼び出し規約が__stdcallでなくて、既定の__cdeclだから件のエラーが出ている様にもみえます。
DLLの改変が出来ないのであれば、VBAにてDispCallFuncで呼び出す他無いと思われます。
https://codezine.jp/article/detail/6780

2016/12/2716:36:41

残念ながらVBAではアドレス境界をプログラムが制御することは出来ないので、構造体ではなくバイト配列のアドレスをDLLに渡すしか方法はありません。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

プロフィール画像

カテゴリマスター

tac********さん

2016/12/2712:55:39

構造体の事をVBAでは”ユーザー定義型”と呼びます。
その他DLLの呼び出し方に付いての知識は私には有りません。

参考になれば幸いです。



ユーザー定義型
http://officetanaka.net/excel/vba/variable/12.htm

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる