C++で作成したDLLをVBから変数を渡して
文字列が格納されているメモリアドレスを取得して、
別のDLLにメモリアドレスを渡したいのですが、
具体的な指定の仕方を教えてください。

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

A 回答 (4件)

Longで定義した変数でうけとって、その変数を渡せばOKです。

この回答への補足

ありがとうございます。
VC++のDLL側では何で渡せばいいのでしょうか。
char *str;でアドレスを保持してます。
キャストして代入など行ってるのですが、うまくいきません。
よろしくお願いします。

補足日時:2001/09/18 11:11
    • good
    • 0

サンプルどうぞ



参考URL:http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/00 …
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2001/09/18 11:20

日本語として成り立っていないので、勝手に解釈します。



VBの文字列のアドレスを取得することはできません。
VBが文字列をAPIに渡すとき、必ずBSTR→LPSTRの変換が行われ、実際に渡されるアドレスはその先頭になります。
そして、APIから制御が返ったときに、LPSTR→BSTRの変換をして、元に戻します。
そのために、APIに渡したアドレスを関数が終わった後にストックしておいても、無効なアドレスを参照することになります。

具体的に何が目的なのかが明確になれば、別の方法を提案できると思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2001/09/18 11:21

以下のページでも参照してみればどうですか?


どのくらい試したのか書いているともっと具体的にアドバイスが
もらえるかと思いますよ。

参考URL:http://www.angel.ne.jp/~mike/vb_dll/

この回答への補足

以前arataさんに教えていただいたものなんですけど、
Public Declare Sub MemCopy _
Lib "Kernel32" Alias "RtlMoveMemory" _
(hpvDest As Any, _
hpvSource As Any, _
ByVal cbCopy As Long)
↑これのhpvSource As Anyに入れるメモリアドレスは
VC++で作成したDLLから取得して、指定したいのですが指定の仕方が
わからないので教えてください。

補足日時:2001/09/13 11:34
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2001/09/18 11:22

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

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

QVB2010 変数に格納する文字列を増やす

単純なことなのですが、、、どうしても方法が思い浮かびません。
下記のプログラムでは2735回変数にDataGridの値を格納
していますが、本来行いたい処理は
Dataの中に2735回出た結果を文字列として連結したいです。
(たとえば..1回目でA 2回目でBと出た場合、DataにAB)
方法をご教授下さい。

For Row=0 To 2734
Data=Me.DataGridView1(CC,Row).Value
Next

Aベストアンサー

Data &= Me.DataGridView1(CC,Row).Value

または String.Concat を使う
Data = String.Concat(Data, Me.DataGridView1(CC,Row).Value)

または高速処理が可能な StringBuilder を使う
Dim sb As New System.Text.StringBuilder()
For Row = 0 To 2734
sb.Append(Me.DataGridView1(CC,Row).Value)
Next

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

QAPI関数(DLL)の呼び出しにおいて、DLLの格納場所は?

お世話になります。
VB.NETでAPI関数を呼び出す場合にまず、API関数を格納しているDLLを宣言しなけれならないと下記URLにあります。
(http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html)

(a)DllImport属性を利用する方法
<System.Runtime.InteropServices.DllImport("DLL名")> _
Function API関数名(仮引数)
End Function
(b)Declareステートメントを利用する方法
Declare Function API関数名 Lib "DLL名" (仮引数)

そこで、質問なのですが、(a)、(b)どちらの方法で実現する場合においても、DLLの格納場所はC:\Windows\System32でないといけないのでしょうか?(実際にコーディングしてもSystem32フォルダにないとエラーになってしまいます。)
任意のフォルダにDLLを格納し、そこを参照できるようにできるのでしょうか?
また、一般常識としてDLLはSystem32フォルダに格納しておかないといけないものなのでしょうか?

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

お世話になります。
VB.NETでAPI関数を呼び出す場合にまず、API関数を格納しているDLLを宣言しなけれならないと下記URLにあります。
(http://www.atmarkit.co.jp/fdotnet/dotnettips/024w32api/w32api.html)

(a)DllImport属性を利用する方法
<System.Runtime.InteropServices.DllImport("DLL名")> _
Function API関数名(仮引数)
End Function
(b)Declareステートメントを利用する方法
Declare Function API関数名 Lib "DLL名" (仮引数)

そこで、質問なのですが、(a)、(b)どちらの方法で実現する場合...続きを読む

Aベストアンサー

DLL名にパスを含んでいない場合は
1) EXEファイルのカレントフォルダ
2) Windowsのシステムフォルダ(Win9x系ならWindows\Sysytem・WinNT系ならWindows\System32)
3) Winddows\Systemフォルダ
4) Windowsフォルダ
5) 環境変数PATHの設定フォルダ
といった順番でDLLを探すと思います
WinNT系へインストールする際にフォルダの権限などが原因で独自のDLLをWindows\System32へ書き込み出来ないとか
アンインストールなどの機能を提供しない
などの要因によって DLL自体を実行ファイルと同じフォルダに置くこともありますよ

『DLLを必ずWindows\System32に置きなさい』といった規約はありません

QVB.NETからC++のdll連携(double)

プログラミング初心者です。
VB2010からC++で作成したDLLの配列連携で困っています。
下記のサンプルで整数配列(integer)の連携を確認できました。

しかし、double型の連携が同サンプルでは正しい値が渡されません。
(プラットフォーム呼び出しサンプルの”整数 ByVal の配列”を使用しました。)

プラットフォーム呼び出しサンプル
http://msdn.microsoft.com/ja-jp/library/8bbftkst(v=VS.90).aspx

double型の配列は同じ方法で可能なのでしょうか。
別の方法でないと動作しないのであれば、そちらも教えてください。
よろしくお願い致します。

Aベストアンサー

VBの配列はC言語から見るとSAFEARRAY型になります。
これを上手く扱えないと、VB⇔Cの処理は難しくなります。
×:func(double *param)
○:func(SAFEARRAY *param) ★ByValの場合です。

これを扱うAPIがOLEAUT32にあります。
#pragma comment(lib,"OLEAUT32.LIB")をソースに
記述するか、リンカでこのライブラリを指定します。

http://marupeke296.com/IKDADV_CPP_SAFEARRAY.html
この辺にサンプルがあるので、調べてみてください。

QVB.NETからC++で作成したdllの連携

プログラム初心者です。
VB2010からC++で作成したdllへ配列を渡したいのですが、
動作するサンプルがありましたら教えてください。

単純な数値(int)であれば下記のページのサンプルコードをダウンロードして
動作可能でした。
http://www.geocities.jp/i_love_balard/myhome/vbdll.html

しかし、以下のサンプルを作成したのですが、動作しませんでした。
http://www7.atwiki.jp/hisam/pages/51.html
http://support.microsoft.com/kb/402577/ja
http://support.microsoft.com/kb/410837/ja

よろしくお願い致します。

Aベストアンサー

なんか,サンプルを参照する場所を間違えているようにしか思えないのですが……。
MSKBはVB2用だったりVB5用だったりと,古い情報です。
挙げられたサイトの内,Visual Basic 2010対応の物は,atwikiのもののみです。
# 個人的にはIntPtr使ってやるのは面倒すぎると思う……。


で,サンプルですが,ちゃんとMSDNに記述があります。

MSDN: アンマネージ コードとの相互運用
http://msdn.microsoft.com/ja-jp/library/sd10k43k.aspx
MSDN: さまざまな型の配列のマーシャリング
http://msdn.microsoft.com/ja-jp/library/hk9wyw21.aspx


このカテゴリの人気Q&Aランキング

おすすめ情報