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と関連する良く見られている質問

Qメモリに余裕があるのにヒープが確保できないです。

趣味のプログラムなので切実な問題ではないのですが、
1秒間隔に処理を行うプロセスを-Xmx64Mの指定で6つ起動しようとするのですが、
6つ目でヒープが確保できなくて処理が走りません。
スレッドは1プロセスあたり15くらいです。
OSはWindowsXPでCPUはPentium Dual-core E2140で
メモリは2GBつんでいるのですが、
タスクマネージャでみると1GB強しかつかってません。
できれば6つ同時に走らせたいのですが、方法はありますでしょうか?

Aベストアンサー

ヒープエリアはたしか全プロセスで共通に使われるはずです。
-Xmx64M を -Xmx128M 等に変更して動かしてみて下さい。

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

QC/C++言語のメモリについて

C言語でメモリを2種類?に分けると、スタックとヒープがあります。
ヒープは mallocなどで確保し、freeで解放しますがスタックは解放する必要がありません。
そのスタックは通常、何バイトまで可能なのでしょうか?

あと関数外のファイルの先頭に int[1000000];とした場合、このメモリはmallocで確保していませんが、
どこに作られるのでしょうか?

私のパソコンはメモリが2GBでWindows2000ですが、CやC++で最大、何バイトまでメモリが使えますか?
また、一番多くメモリを確保できるなら、OSはなんでも構いません。

解釈等も間違っていたらご指摘していただきたいです。

Aベストアンサー

マイコン向けのプログラムを書いてます、Interestと申します。

> C言語でメモリを2種類?に分けると、スタックとヒープがあります。

間違いではありませんが、ちょっと足りません。プログラムで使用するメモリはもう少し細かく見ると、次のようになっています。

(P) 実行される命令(ProgramとかCodeと呼ばれます)
(C) 定数など変更されないデータ
(D) 初期化されるデータ
(B) 初期化されないデータ
(H) プログラムから動的に割り当てられるメモリプール(これがヒープです)
(S) ローカル変数、関数の引数、呼び出し元関数へのリンクに使用する比較的短命なものに使用するメモリプール(これがスタックです)

> そのスタックは通常、何バイトまで可能なのでしょうか?

開発環境によって初期値が決まっているようで、どれだけ割り当てるか変更できるようです。OSには依存しません。Visual C++ 6.0の場合、スタックサイズの初期値は1MBだそうです。
参考 http://okwave.jp/qa2645032.html

> あと関数外のファイルの先頭に int[1000000];とした場合、
> このメモリはmallocで確保していませんが、どこに作られる
> のでしょうか?

最初に説明した内容に照らすと、一般に外部変数は0で初期化されますから、(D) 初期化されるデータ の領域に確保されることがわかります。

> 私のパソコンはメモリが2GBでWindows2000ですが

WindowsなどのOSは物理メモリが足りなければハードディスク上の仮想メモリも使用しますので、単純に何バイトまで使えます、とはお答えできません。

> 一番多くメモリを確保できるなら、OSはなんでも構いません。

どのようなプログラムを組もうとしているのですか?

マイコン向けのプログラムを書いてます、Interestと申します。

> C言語でメモリを2種類?に分けると、スタックとヒープがあります。

間違いではありませんが、ちょっと足りません。プログラムで使用するメモリはもう少し細かく見ると、次のようになっています。

(P) 実行される命令(ProgramとかCodeと呼ばれます)
(C) 定数など変更されないデータ
(D) 初期化されるデータ
(B) 初期化されないデータ
(H) プログラムから動的に割り当てられるメモリプール(これがヒープです)
(S) ローカル変数、関...続きを読む

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ヒープ領域の限界値設定

大量にメモリを消費するアプリケーションを下記環境で動作させようとしています。
WindowsXP SP2, 1GB RAM
タスクマネージャの物理メモリの利用可能 674,500K位
この状態でヒープ領域をレジストリで変更しようと思っているのですが
限界値が不明です。
徐々に3071⇒4096⇒8192と上げていっているのですが、限界値を超してしまうとOS自体が起動できなくなる恐れがあるので怖いです。
アドバイスください。

Aベストアンサー

回答No.1に挙げた「デスクトップ ヒープ」で用いている「ヒープ」という用語は、グラフィックサブシステムで使用するためにWindowsのグラフィックサブシステムがあらかじめ確保して自分自身のために使用するメモリ領域のことを指しています。

また「mallocが使用するヒープ領域」という場合の「ヒープ」という用語は、ライブラリ関数mallocがWindows APIを使用して確保するメモリ領域のことを指しています。

ですので、「デスクトップ ヒープ」と「mallocが使用するヒープ領域」は違うものです。


「mallocが使用するヒープ領域」がどこから来るのかは、コンパイルに使用した言語環境のライブラリ関数mallocの動作内容に依存します。

仮にMicrosoft Visual C++(VC++ Version 6.0以降)を使用してコンパイルし、ライブラリ関数は標準添付のものを使用したとすると、mallocはWindows APIのHeapAllocで取得したメモリ領域をライブラリ内で細分(サブアロケート)して返します。またこの場合、HeapAllocで取得できるメモリ領域の量に固定の上限はなく、PCのメモリ実装量、Windowsのスワップ領域の大きさ、それとアプリケーションプロセスのメモリマップが許す限り、いくらでもHeapAllocはメモリを割り当てて返すことができます。

ですので上記の場合、mallocも同様に「PCのメモリ実装量、Windowsのスワップ領域の大きさ、それとアプリケーションプロセスのメモリマップが許す限りいくらでも」メモリを割り当てて返すことができます。

なお、上記動作はライブラリのソースコードを見て確認したものですので、使用しているコンパイラがVC++ではない、あるいはVC++でもVersion 6.0より古い場合、mallocが「いくらでもメモリを割り当てて返すことができる」かどうかは分かりません。(しかし、返すメモリ領域が「デスクトップ ヒープ」と違うものであることだけは変わりません。)

回答No.1に挙げた「デスクトップ ヒープ」で用いている「ヒープ」という用語は、グラフィックサブシステムで使用するためにWindowsのグラフィックサブシステムがあらかじめ確保して自分自身のために使用するメモリ領域のことを指しています。

また「mallocが使用するヒープ領域」という場合の「ヒープ」という用語は、ライブラリ関数mallocがWindows APIを使用して確保するメモリ領域のことを指しています。

ですので、「デスクトップ ヒープ」と「mallocが使用するヒープ領域」は違うものです。


「mal...続きを読む

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に置きなさい』といった規約はありません

Qメモリをたくさん使うテストプログラム

Linuxで、メモリをたくさん使うようなテストプログラムを作りたいのです。
メモリといっても、プログラムコードの入っているテキスト領域、データの入っているデータ領域、ヒープ領域などがあると思いますが、
これらのいずれかのみをたくさん使うようなプログラムを作りたいのです。
例えば、サイズの大きなプログラムであれば、テキスト領域が大きくなったり、
大容量の文字列を扱ったりすると、データ領域が大きくなったりするんでしょうか?
関数とメモリ使用量の関係があまり分かっていません。
どうか教えてください。

Aベストアンサー

#1です。
>テキスト領域を大量に確保するには、無駄に長いプログラムを書けばいいのでしょうか?
はい、その通りです。
>mallocした領域にデータを書き込むと、今度はデータ領域がたくさん使われるのでしょうか?
いいえ、mallocした領域は、ヒープ領域であり、ヒープ領域にデータを書き込んだからといって、データ領域が増える訳ではありません。

コーディングでは、以下のようになります。
-----------------
#include ....ヘッダファイル
char data1[256];  ・・・・データ領域
main()
{
data data2[256];  ・・・・スタック領域
if (・・・){    ・・・・テキスト領域
・・・
}
malloc(3000)    ・・・ヒープ領域へ確保
}

main等の関数の外側で確保した領域は、データ領域に取られます。
main等の関数の内側で確保した領域は、スタック領域に取られます。(static指定を除く)
実際に命令(if文など)は、テキスト領域にとられます。
mallocで確保したメモリはヒープ領域に取られます。
(但し、テキスト領域の言葉は正しいかどうか不明です。参考URLを参照下さい)
ところで、どうして、メモリをたくさん使うようなテストプログラムを作りたいのですか、よかったら教えて下さい。そのほうに興味があります。

参考URL:http://www1.cts.ne.jp/~clab/hsample/Point/Point19.html

#1です。
>テキスト領域を大量に確保するには、無駄に長いプログラムを書けばいいのでしょうか?
はい、その通りです。
>mallocした領域にデータを書き込むと、今度はデータ領域がたくさん使われるのでしょうか?
いいえ、mallocした領域は、ヒープ領域であり、ヒープ領域にデータを書き込んだからといって、データ領域が増える訳ではありません。

コーディングでは、以下のようになります。
-----------------
#include ....ヘッダファイル
char data1[256];  ・・・・データ領域
main()
{
data...続きを読む

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
この辺にサンプルがあるので、調べてみてください。

Qjava string 配列の使用メモリ

String[][][] arg = = new String[x][x][x];
でxが638の時にjava.lang.OutOfMemoryErrorになってしまいます。
VM起動時のヒープ最大値は1GBまで試しましたがダメでした。

このときargオブジェクトはどれだけのメモリを必要とするのでしょうか?

Aベストアンサー

このnewで作られるオブジェクトは、配列オブジェクトだけです。Stringオブジェクト自体は作られません。
なので、オブジェクトのサイズとしては、配列オブジェクトのサイズだけを考えればよいことになります。
(ちなみに、メソッド本体はクラスに1つあるだけで、作成したオブジェクトの数だけできるわけではないですから、オブジェクトを作ると、新たにメソッドの分のメモリが必要になるわけではありません)

さて、argオブジェクトのサイズですが、1つのオブジェクトへの参照を保持するのにまず何バイトが必要か考える必要があります。
32bitのJavaだったら、たぶん32bit=4バイトでしょう。
この配列の要素数はx^3個ですので、1つあたりが4バイトとなると、x^3 * 4 バイトのメモリが最低限必要ということになります。
もちろん、他にも多少メモリが必要でしょうが、xが大きいときのことを考えるわけですし、無視しても問題ないでしょう。

x=638の場合を計算してみると、638^3 * 4 = 1038776288 となります。
これは約990MB で、だいたい1GBです。
ヒープの最大値を1GBで試したということですので、計算と合っているのではないでしょうか。

このnewで作られるオブジェクトは、配列オブジェクトだけです。Stringオブジェクト自体は作られません。
なので、オブジェクトのサイズとしては、配列オブジェクトのサイズだけを考えればよいことになります。
(ちなみに、メソッド本体はクラスに1つあるだけで、作成したオブジェクトの数だけできるわけではないですから、オブジェクトを作ると、新たにメソッドの分のメモリが必要になるわけではありません)

さて、argオブジェクトのサイズですが、1つのオブジェクトへの参照を保持するのにまず何バイト...続きを読む

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を見た人がよく見るQ&A

人気Q&Aランキング