• ベストアンサー

構造体配列を引数とするDLL作成し、VBで呼ぶには?

hysteric5の回答

  • hysteric5
  • ベストアンサー率28% (4/14)
回答No.4

私も同じような事を現在していますが。VBのUDT構造体は各要素間で連続していないので戻り値をそのまま使うのには無理があると思います。方法としてはVBの隠し関数であるStrPtr(.netからはサポートされていません)を使用し構造体の先頭ポインタを取得しその後、RtlMoveMemory又はCopyMemoryのAPIを使用し取得したポインタより構造体の長さを切り取り取得していくのが妥当だと思います。

参考URL:
http://www02.so-net.ne.jp/~handa/deadend/c_vb.html#4
tosakoku
質問者

お礼

回答ありがとうございました。 RtlMoveMemoryを使用してうまくいきました。 ありがとうございました。

関連するQ&A

  • VC6.0で作成したDLLでVBからの配列を受け取る方法

    VC++でDLLを作成しています。 VBから呼び出しで、配列を渡し、その配列の値を VCで使用したいのです。 通常変数でテストして、うまくいっているのですが、 配列に変更したところ、値がうまく渡りません。 どなたかお分かりになられる方いらっしゃいましたら お力をお貸し願えないでしょうか? 変数で成功しているプログラム VB6.0 標準モジュール Declare Function fncTest Lib "fncTest.dll" (a As Long) As Long フォーム Private Sub Test_Click() dim i as integer i = fncTest(1) End Sub VC++6.0 fncTest.h fncTest_API int _stdcall fncTest(int); fncTest.cpp fncTest_API int _stdcall fncTest(int a) { a = a+1; return a; } fncTest.def     省略 変数aを配列に変更して作ってみたもの(配列bにVBからの配列aの値を入れようとしていますが、 うまくいっていません。) VB6.0 標準モジュール Declare Function fncTest Lib "fncTest.dll" (ByRef a() As Long) As Long フォーム Private Sub Test_Click() Dim i As Integer Dim hairetu(7) As Long Dim values As Variant For i = 0 To 7 hairetu(i) = i Next i values = fncTest(hairetu()) End Sub VC++6.0 fncTest.h fncTest_API int _stdcall fncTest(int*); fncTest.cpp fncTest_API int _stdcall fncTest(int* a) { int b[7]; int i; for (i = 0;i <= 7;i++){ b[i] = a[i]; } return 0; } 以上よろしくお願いします。

  • VCで作ったDLL【否 .Net】 配列

    VCでDLLを作り、VBから呼び出しています。 今やりたいのは、Cで言えば void Calc(int a, int b, int x[]) {  x[0] = a + b;  x[1] = a - b;  x[2] = a * b; } int main(int argc, char *argv[]) {  int n[3];  Calc(8,1,n);  printf("%d %d %d\n",n[0],n[1],n[2]);  return 0; } と、いうことです。 関数Calcを__stdcallやdefファイルを使って呼び出せるようにし、VBから呼ぶのですが、うまくいきません(~~メモリが"written"になることは~~)。 VBでは Declare Sub Calc Lib "SimpleDll.dll" (ByVal a As Long, ByVal b As Long, ByRef x() As Long) …略… Dim x(3) As Long Call Calc(6, 4, x) …略… としています。 どうかお力添えを。

  • VB6からDLLへの構造体受け渡し

    VB6からCで作成したDLLに構造体を受け渡したいのですが上手くいきません。 構造体にはLong型やDouble型、それに他の構造体も含まれておりC側も同様にしているつもりなのですが文字化けしてしまいます。下記に入力しているのコードを記載しましたので分かる方がいましたら助けてください。 尚、下記の構造体の「method」までは問題無く取得できるのですが「success_interlinkage」のDouble型からの変数は文字化けした数字になってしまいます。宜しくお願い致します。 [VB側] Public Type PackageProcessingInfo_i brightness As Long contrast As Long smoothtype As Long smoothlevel As Long method As Long success_interlinkage As Double min_interlinkage As Double max_interlinkage As Double min_point As CvPoint max_point As CvPoint corner_point As CvPoint End Type Public Type CvPoint_i x as Long y as Long End Type [C側] typedef struct _PackageProcessingInfo { int brightness; int contrast; int smoothtype; int smoothlevel; int method; double success_interlinkage; double min_interlinkage; double max_interlinkage; CvPoint min_point; CvPoint max_point; CvPoint corner_point; } PackageProcessingInfo; typedef struct _CvPoint { int x; int y; } CvPoint;

  • VC++で作成したDLLをVBから呼ぶと戻り値が化けてしまう

    はじめまして。いつも勉強させていただいております。 VCは今回初めてやっておりますので当たり前の質問 になってしまうかもしれませんがご教授願います。 以下のような仕様でものづくりを行っております。 1.VBよりVC++で作成したDLLを呼び出す。 2.VC++で作成したDLL側ではパラメータより取得した   値を元に足し算をした結果を   戻り値にセットして要求元に返却する。 といった流れで考えています。 2の部分についてはExeを一度作成し実行させた ところDOS窓に値が表示されました。(printfで) しかし、正しくOUTPUTされた値がVB側の戻り値と して返却された時点で参照すると「-6348」 となっています。 なぜこうなってしまうのか原因がわからず投稿 させて頂きました。 ご存知の方、ご教授下さい。 ************************************************* VC++ DLL側のソース ************************************************* #include <windows.h> #define DLL_EXPORT __declspec(dllexport) extern "C" { DLL_EXPORT int add(int a,int b); } int add(int a,int b) { return a+b; } ************************************************* VB  DLL呼び出し元 ************************************************* Option Explicit Private Declare Function add Lib "C:\Program Files\Microsoft Visual Studio\test\Debug\test.dll" Alias "_add@8" (a As Long, b As Long) As Integer Private Sub Command1_Click() Dim ret As Long ret = add(1, 2) MsgBox ret End Sub 環境 OS:WinXP 言語:VC++6.0    VB6.0(SP6)

  • 配列をDLLの戻り値としてVBAで受け取る書き方

    vbdll.dll: int * __stdcall arr() { int a[] = {1,2,3}; return a; } vba: Declare Function arr Lib "C:\temp\vbdll.dll" () As Long() Sub test() Dim ccc() As Long ccc = arr Debug.Print ccc(0) End Sub インデックスが有効範囲にありませんになります 配列をDLLの戻り値としてVBAで受け取る書き方を教えてください? 何卒、ご教授お願いします。

  • VBからのDLL呼び出しでエラー発生

    お世話になります。 Cで作成したDLLをVB6から呼び出した時にエラーが発生します。エラー内容は「実行時エラー'49'DLLが正しく呼び出せません。」です。 いろいろ試してみると、DLL側にパラメータを指定した場合にエラーが発生しているということが分かったのですが、対処方法は分かりませんでした。 以下にソース内容を記述致しますので、何処が悪いのかをご指摘頂けませんでしょうか。 <DLL側(aaa.dll)> __declspec(dllexport) int MyFunction1() { return 4; } __declspec(dllexport) int MyFunction2(int x) { return x * 2; } <VB側> 共通.bas Public Declare Function MyFunction1 Lib "aaa.dll" () As Long Public Declare Function MyFunction2 Lib "aaa.dll" (ByVal a As Long) As Long 実際の使用箇所 Dim param As Long Dim returnCode As Long MsgBox MyFunction1() param = 3 MsgBox MyFunction2(param) どうぞ宜しくお願い致します。

  • vc++のAPI(dll)の引数をVBAでうけとる

    Excelで開発しなければならない事情があり、 vc++のAPIが持っている関数を ExcelVBAでコールしておりますが、エラー1041でExcelが強制終了してしまいます。 VBAからVisual C++にchar*型で渡し、ByRef String型でVBAにて受け取ります。 VCの関数の第四引数「char* 型/attribute_value」をVBAの「String 型/sValue」で受け取る際にエラーになっているようです。 VBAでcharに相当する変数型がないためと思われますが、何かよいアイデアがありましたらご教授願います。 --VC-- XDW_GetDocumentAttributeByName(h, attribute_name, &attribute_type, attribute_value, size, NULL); --VBA-- <宣言部> Public Declare Function XDW_GetDocumentAttributeByName Lib "C:\Users\○○○\Desktop\dwsdk710jpn\XDWAPI\DLL\xdwapi.dll" (ByVal lnghandle As Long, ByVal sName As String, ByRef lngType As Long, ByRef sValue As String, ByVal lngSize As Long, ByVal reserved As String) As Long <呼び出し部> Dim lngHandle As Long Dim sName as String Dim lngType As Long Dim sValue As String Dim lngSize as Long Dim tmpSize as Long lngSize = 0 sName = "keiyaku" tmpSize = XDW_GetDocumentAttributeByName(lngHandle, sName, sType, sValue, lngSize, vbNullString) XDW_GetDocumentAttributeByName lngHandle, sName, sType, vbNullString, tmpSize, vbNullString degug.print sValue

  • VB2005 から DLL を呼び出す

    VB 初心者です。 今、VB の練習ということで VB 2005 Express Edition を使って、個人用ブラウザをつくっています。Web ページの表示は Webbrowser コンポーネントを使っています。 その仕様で、閲覧先によって HTTP Proxy を変更するようになっています。(自分で決めたんですが) いろいろ調べてみると、urlmon.dll の UrlMkSetSessionOption() を呼べば自分のアプリケーション限定で Proxy を変更できるようだ、ということがわかりました。 古い VB など(VB 6 とか?)では、 Private Declare Sub UrlMkSetSessionOption Lib "urlmon.dll" _ (ByVal dwOption As Long, ByVal pBuffer As Any, _ ByVal dwBufferLength As Long, _ ByVal dwReserved As Long) このような感じで宣言するとかあったんですが、VB2005 では Any がダメだとか、 Type INTERNET_PROXY_INFO Dim dwAccessType As Long Dim lpszProxy As String Dim lpszProxyBypass As String End Type で Type はダメだとか、呼び出し側で、LenB を使おうとしたら使えないだとか、INTERNET_OPTION_PROXY の値がわからないなど、問題が山積みです。 上記 DLL を VB 2005 で使ったことがある人がいたら(またはわかる人)、使い方を教えてもらえないでしょうか?

  • VCのDLL内でmallocした構造体をVBで使用

    題名通りですが、 VC側のDLLにてmallocで構造体の領域を確保しています。 この領域をVB側で使用したいのですが、やり方がわかりません。 イメージは Public Declare Function GetData Lib "xxx.dll" (ByRef datas As KOUZOUTAI, ByRef dataCnt As Long) As Boolean みたいな形で、datasに構造体のデータ、及び dataCntに領域確保したデータ数を取得出来ればなと思っております。 VB側では、これもイメージですが、 dim datas() as KOUZOUTAI dim dataCnt as long GetData(datas, dataCnt) for cnt=0 to dataCnt - 1 msgbox datas(cnt).a msgbox datas(cnt).b msgbox datas(cnt).c next みたいな感じで処理をしたいと思っております。 お聞きしたい事は 1)そもそも可能なのか? 2)declare宣言のdatasのところが???です。 3)dim datas() as KOUZOUTAIのところも宣言が???です。 4)datas(cnt).a等としているところも配列?として処理出来るのかが???です。 以上、よろしくお願いします。

  • VBからCで作成されたDLLへの引数の渡し方

    VBからCで作成されたAPI関数への引数の渡し方がわかりません。 C側の引数のデータ型はchar型でポインタ渡しではありません。 ------------------------------------------------ C側 int KANSU(char Mode) VB側 Public Declare Function KANSU Lib "USERAPI.dll" ( ByVal CHAR As Byte) As Long ------------------------------------------------ C側がポインタ渡しの場合は、VB側はSTRING型で別に悩むことはなかったのですが、文字列渡しの場合は、VB側はBYTE型で渡す必要があり、その方法がわかりません。 どなたか、分かる方よろしくお願いします。 ちなみに、VB6.0です。