トップページ⇒tech
27コメント7KB

VBでDLL関数にユーザ定義型配列を渡す方法!!

■ このスレッドは過去ログ倉庫に格納されています
0001ゆいNGNG
VBでDLLプロシージャにユーザ定義型配列を渡したいんですが、直接引数として渡して
しまうと エラー(不正な処理)がでてくるんです。
ユーザ定義型配列はメモリ上で連続していないのが原因のように思うんですが、
どうしたらよいか分かりません。
どなたかよろしくお願いします。
0002デフォルトの名無しさんNGNG
ソースがないとえんっぜんわからん
0003ゆいNGNG
会社で作ったソースなので見せることが出来ません。ごめんなさい。
普通の配列をDLLプロシージャに渡すサンプルを
見せていただけると応用しますので教えてください。
よろしくお願いします。
0004デフォルトの名無しさんNGNG
>>3
まぁそういう要求のしかたもあるけどさ、
一般に通用するたぁ限らないから教えちゃる。

まず自分のほうから、会社秘密的な問題のないように書き直した
「そのトラブルを起こす(簡単な)例」を作って示すもんだ。

まぁこのケースはVBできる人なら例なくても答えられる
ような問題だろうからそれはそれだが、今後は…。
0005ゆいNGNG
ごめんなさい、なんだかショックで泣きそうです。
上司に相談したらこういう事はしてはいけないと
教えてもらいました。

明日はお休みですのでいえで一日考えて、
それでもわからなければ明後日は会社の先輩も
出社していますので、その方に聞いてみます。

よる遅くにすいませんでした。
0006デフォルトの名無しさんNGNG
マターリとして良いスレだな
0007デフォルトの名無しさんNGNG
せめてDLLのインタフェースぐらい書けよ。
0008ゆいNGNG
インターフェイスって?初心者です
すいませんでした
0009デフォルトの名無しさん NGNG
インターフェースすら知らんのかよ・・・(ガーン
0010ゆいNGNG
すいません
0011デフォルトの名無しさんNGNG
>>10
それ、すいませんじゃ済まないよ。
初心者なら構文よりも先に良く出てくる言葉の意味を勉強すべき。
VB以前の問題と言われても仕方ないよ。。。
0012デフォルトの名無しさんNGNG
>>11
ネタだろ。熱くなるなよ。
0013デフォルトの名無しさんNGNG
ユーザ定義型配列って引数として渡せるの?
00147NGNG
まず VB ADDRESSOF で検索して下さい。
次は無い。
00154NGNG
>>4
しちゃいけないって何を?
もしかして俺が書いたようなことを?
だとしたらその会社終わってる。

だとしたらの場合についてコメントしとくけど、
ちょうど俺が言いたいこと(笑)を代弁してくれてる頁があったんで
参照しとけ。
http://www.amy.hi-ho.ne.jp/~lepton/program/p1/prog109.html
ここで紹介されてるような馬鹿は死すべし。

#どういう馬鹿かというと、「自分とこの秘密そのもの」と
#「秘密とは関係無い一般的話題」を切り分ける能力が無いという馬鹿。
00164NGNG
あ。しまった。>>15を投げる相手は4じゃなく>>5のつもりでした。
0017デフォルトの名無しさんNGNG
hoge(a(0))で先頭要素へのポインタを渡せるんじゃなかったっけ。
0018デフォルトの名無しさんNGNG

ユーザ定義型配列はメモリ上で連続していない<-本当?
0019デフォルトの名無しさんNGNG
44444
0020デフォルトの名無しさんNGNG
話が見えない。
VBからCで作られたDLLを呼ぶときの話なのかな。
http://www5.ocn.ne.jp/~kansroom/vbtips/waza14.htm
には、「VBでは、構造体の変数を引数にする場合は、必ずByref渡しになります。」
って書いてあるので、特に指定しなくて良いと思われる。
例えば、
Public Type WNDCLASSEX
 cbSize As Long
 style As Long
 lpfnWndProc As Long
 cbClsExtra As Long
 cbWndExtra As Long
 hInstance As Long
 hIcon As Long
 hCursor As Long
 hbrBackground As Long
 lpszMenuName As String
 lpszClassName As String
 hIconSm As Long
End Type
Public Declare Function RegisterClassEx Lib "user32" Alias "RegisterClassExA" (pcWndClassEx As WNDCLASSEX) As Integer

って感じでよかったはず。
自作したCのDLLの場合には、VB側で構造体が32bit境界でパディングされて、
うまくいかなくなることはありうると思う。
そういうときには、byteの配列で宣言しておいて、
気合で代入するしかないかなあ。

14がAddressOfを指摘してるけど、関数のポインタは関係ないと思う。
002120NGNG
う、構造体の配列!?
0022デフォルトの名無しさんNGNG
どのみちポインタで渡してるんだから、構造体が構造体配列になっても同じでは?
型を事前に特定できない場合は
Public Declare Function MapWindowPoints Lib "user32" Alias "MapWindowPoints" (ByVal hwndFrom As Long, ByVal hwndTo As Long, lppt As Any, ByVal cPoints As Long) As Long
のようにAs Anyで宣言すると型チェックしなくなるが、どう?
0023デフォルトの名無しさんNGNG
この問題難しすぎ!!
0024デフォルトの名無しさんNGNG
回答するのが面倒だから、

ダニエル・アップルマン著「Win32 API パズルブック」翔泳社刊

を買え。すべて書いてある。
0025デフォルトの名無しさんNGNG
おーい誰か1にGNU/GPLを教えてやれ
ソース見せられん、例も見せられんじゃ
こちらも何も出来ん
ていうか虫よすぎ
0026デフォルトの名無しさんNGNG
GNU/GPL
0027デフォルトの名無しさんNGNG
ダニエル・アップルマン著「Win32 API パズルブック」
良い本である
■ このスレッドは過去ログ倉庫に格納されています