<VC++で作成したDLLをVBで呼ぶ処理>
VBから変数をDLLに渡して値を格納してVBで受け取りたいのですが、
文字列が格納されている先頭アドレスをVBに渡したい場合の
方法を具体的に教えてください。
構造体を使用する方法はできたのですが、使わない方法(引数が変数)を
教えてください。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

DLLでどんな処理をしたいのですか



下記URLを見ても、だめなら
もっと具体的に書かないと解らない。

参考URL:http://www.microsoft.com/JAPAN/support/kb/articl …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qvc++の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

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(...続きを読む

Aベストアンサー

XDW_GetDocumentAttributeByNameのなかで sValueに文字列を設定するのであれば
あらかじめ sValueにデフォルトの文字列を与えておいて呼び出すようにしてやればいいでしょう

APIの記述は ByVal sValue as String で行います

Dim sValue as String * 256
といった固定文字列
Dim sValue as String とするならば
DLLを呼ぶ前に
sValue = Space(256)
といった具合に初期化しておきます

DLLを呼び出す場合には Unicode/Ansi変換を自動で呼び出すと思います
VBA側にリターンしてから逆変換をしますし ・・・

QVB.netでのVC++呼び出し引数の順番

VC++で作成されたDLLをVB.NetにてそのDLLを呼び出すアプリを作成して
います。以下のパターン2では問題なく動作しますが、パターン1では
DLL側で見たときにchar変数に正しく値が入りません(NULL)になる。
パターン1とパターン2の違いは引数の順番です。
開発環境:VisualStudio2008
OS:WindowsXP SP2

パターン1(この場合はNG)
 VC++側の宣言
  extern "C" __declspec(dllexport) void func1(int i,char*s)
 VB.Net側の宣言
  <System.Runtime.InteropServices.DllImport("func.dll")> _
  Public Sub func1(ByVal i As Long, ByVal s As String)
  End Sub

パターン2(この場合はOK)
 VC++側の宣言
  extern "C" __declspec(dllexport) void func1(char*s,int i)
 VB.Net側の宣言
  <System.Runtime.InteropServices.DllImport("func.dll")> _
  Public Sub func1(ByVal s As String ,ByVal i As Long)
  End Sub

VC++側がパターン1で作成さているため、VC++側を修正をしないで
正常に動かすことは可能でしょうか?

よろしくお願いします。

VC++で作成されたDLLをVB.NetにてそのDLLを呼び出すアプリを作成して
います。以下のパターン2では問題なく動作しますが、パターン1では
DLL側で見たときにchar変数に正しく値が入りません(NULL)になる。
パターン1とパターン2の違いは引数の順番です。
開発環境:VisualStudio2008
OS:WindowsXP SP2

パターン1(この場合はNG)
 VC++側の宣言
  extern "C" __declspec(dllexport) void func1(int i,char*s)
 VB.Net側の宣言
  <System.Runtime.InteropServices.DllImport("func.dll")> _...続きを読む

Aベストアンサー

> Public Sub func1(ByVal i As Long, ByVal s As String)
Longではないのでは?

intは32ビットの数値型ですので Integer か Int32 でどうでしょうか?


パターン2の場合は引数が逆なのでたまたまうまくいくだけで、もしかしたら
別のところで弊害がでるかも。
(戻り値があったりするとうまくいかないかな)

QVB6.0で作成したデータ(配列に入った数値)をVC++に渡したい

掲題の件ですが、
VB6.0ではアドレスを指定して、
メモリを書いたり読んだりすることが困難ということが分かり、
VBで計算した結果をVC++に渡して、VC++でアドレスを指定してメモリに書き込んだり、
読み込んだりするようにしようと考えています。

プログラミングは初心者なので、これが実現可能かどうかが分からないのですが、
調べると、VC++でDLLファイルを作ってVBで参照するという方法はあったのですが。

・これは実現できるのか。
・どこにどのようなコードを書けば良いか(同プロジェクト内に違う言語を存在させることは可能か。)
・受け手側はどのように記述すれば値を受けれるか

以上よろしくお願いします。

http://forums.belution.com/ja/vb/000/007/59.shtml
このような問題がありました。

Aベストアンサー

>C言語でDLLを作成し、VBで呼び出すのでよろしいでしょうか?

yoshi004さんの立場だとそういうことになります。

>なにか環境に関する読みやすい本はご存知でしょうか?

さすがに私がDLL開発したのは10年くらい昔の話ですから
最近の本は分かりませんねえ。

ただ、昔と比べて書籍は不自由しないようになりましたから、
1フロアに専門書が置いてあるような大きな書店なら
目的の本はたいてい見つかると思います。

そういう場所で1~2時間くらいかけて目的の本を探すことも
これまた必要な経験です。

QVB.net 引数で配列変数を渡す際の要素数

VB.net 2010 の質問です。

配列変数を他のプロシージャに引数で渡す際の、配列変数の要素数をあらかじめ宣言していないとエラーになります。


Dim Hairetsu() As String ' ←エラー
Dim Hairetsu(100) As String ' ←正常


Public Sub aaa(ByRef Hairetsu() As String)

Hairetsu(0) = "Test" '←正常の場合と、エラーの場合

End Sub


Hairetsu(100) のように、要素数を宣言していると、エラーにならないのですが、
プログラム中、要素数がどこまで増加するか、分かりません。
Hairetsu()のように、要素数未確定の配列変数を渡すことは出来ないのでしょうか。


ご存知の方がいらっしゃいましたら、なにとぞアドバイスの程、よろしくお願いいたします。

Aベストアンサー

まずは、VB.NETでの配列の正体を知っておいた方がよいでしょう。
http://msdn.microsoft.com/ja-jp/library/dd314345.aspx
特に
> 3-3-3 参照型としての配列変数
から下をよく読んで理解してください。


> Dim Hairetsu() As String

は、Stringの配列を覚えることができる変数Hairetsuを用意するだけで、配列の実体は用意されません。
上記URLの「図 3-11 Nothing が代入されるのは、あくまで配列変数 D 自体」が近い状態です。
この図の「配列の実体」が最初から存在しない、というものです。


> Public Sub aaa(ByRef a() As String)
> a(0) = "Test" '←正常の場合と、エラーの場合

※ 念の為、仮引数の名前を変えました。

このsubを aaa(Hairetsu) と呼び出した場合、 Hairetsu() しただけの場合は、a = Nothing となっています。
よって、 a(0) は Nothing(0) ということになり、そんなものは無いのでエラーになります。

※ エラーメッセージはちゃんと読みましょう。
※ 質問するなら、ただ「エラーになります」では対処しようがありません。
※ 正確なエラーメッセージを記載るようにしましょう。
※ 例えば、そのエラーは
※ 「 NullReferenceException "オブジェクトのインスタンスを指定する必要がある部分に null 値が指定されています" 」
※ とか表示されていませんでしたか?



対策ですが、いくつもあるので、目的によって選択することになります。
○ aaa内で Nothingだったら処理を中止するようなコードにする
例) if a is Nothing then exit sub
○呼び出し元で、Hairetuをredimしてからaaaを呼び出す。
○aaa内でredim する。仮引数aはByRefになっているので、呼び出し元の変数が変更される。
 ※ なお、参照型の特性として「a(0) = "Test" 」だけなら、ByVal a でも同じ「配列の実体」にアクセスすることになります。
○ sub aaaではなく、 function aaa() as String() 等といった配列も返す関数にする
○ List(of T) 等の可変長で配列っぽく使えるクラスを使う

まずは、VB.NETでの配列の正体を知っておいた方がよいでしょう。
http://msdn.microsoft.com/ja-jp/library/dd314345.aspx
特に
> 3-3-3 参照型としての配列変数
から下をよく読んで理解してください。


> Dim Hairetsu() As String

は、Stringの配列を覚えることができる変数Hairetsuを用意するだけで、配列の実体は用意されません。
上記URLの「図 3-11 Nothing が代入されるのは、あくまで配列変数 D 自体」が近い状態です。
この図の「配列の実体」が最初から存在しない、というものです。


> Public Sub a...続きを読む

QVBSから別のVBS起動するとき変数を渡したい

色々調べて、
WshShell.Run """C:\abcd.vbs ””10 20" とすれば
引数10,20を渡してVBSを起動できることは分かりました。
しかし、変数AA=10、BB=20として
WshShell.Run """C:\abcd.vbs ””AA BB” では文字列AA、BBが渡されてしまい、
変数を渡すことはできませんでした。
「変数を渡してVBSを起動する」などで調べても見付かりませんでした。
変数を渡してVBSを起動すること自体できないのでしょうか?

どうぞ、知恵をお貸しください。

Aベストアンサー

WshShell.Run "C:\サンプル\abcd.vbs " & AA & " " & BB

で出来ました。

こちらのページを参考にしました。
http://vba-geek.jp/blog-entry-238.html
https://msdn.microsoft.com/ja-jp/library/cc364421.aspx


人気Q&Aランキング

おすすめ情報