VB.NET質問スレ (Part16)
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/06/04(日) 23:48:00http://pc8.2ch.net/test/read.cgi/tech/1143631763/
0153デフォルトの名無しさん
2006/06/15(木) 10:46:57SQL実行後とにopen/closeは論外だろうが
フォーム単位とかイベント処理の単位とかならあり
最近のはコネクションプールされてるからopen/closeのコストもたいしたこと無い
無用なセッションの増加やトランザクションの維持を避ける事と秤に掛けて検討するのが良い
0154デフォルトの名無しさん
2006/06/15(木) 13:03:16だから、毎回(検索の場合、更新はトランザクション単位で)開閉するのが当然。
0155デフォルトの名無しさん
2006/06/15(木) 18:04:47亀だが…
http://support.microsoft.com/kb/895474/
0156デフォルトの名無しさん
2006/06/15(木) 20:24:25本とか読んでてもいまいち理解不能・・・
0157デフォルトの名無しさん
2006/06/15(木) 20:32:280158デフォルトの名無しさん
2006/06/15(木) 20:41:13そういう技術を一から解き明かすようなことを掲示板に求めたって無理だろw
MSDNライブラリのチュートリアルとか、案外丁寧に書いてあるからあれ読めば
理解できるでしょ。
あとMSDNライブラリに『プログラミング Microsoft Visual Basic .NET』って本の、
ちょうど継承の部分を抜粋した奴が入ってるけど、けっこういい文章だよ。
アメリカのエンジニアらしく、論理的で網羅的に書いてあるし。
http://www.microsoft.com/japan/msdn/net/books/ProgVBNET/chapter5.asp
0159デフォルトの名無しさん
2006/06/15(木) 22:23:350160デフォルトの名無しさん
2006/06/15(木) 23:13:351) フォーム内で FLASH の SWF ファイルを再生する事はできますか?
2) Windows エクスプローラのように、コピー中などのアニメーションを表示させたいのですが
どうやって実現したらよいかわかりません。
アニメーションはどうやって実現できますでしょうか?
アドバイスを頂けるとうれしいです。よろしくお願いします。
0161デフォルトの名無しさん
2006/06/16(金) 10:42:391) AxWebBrowser
2) SHFileOperation
0162160
2006/06/16(金) 11:02:52ありがとうございます。
1)AxWebBrowser を調べてみましたが、ブラウザコントロールだと思うのですが Flash Player のプラグインが
インストールされている前提が必要になるようです。
そういった前提条件なく flash を再生する方法はないでしょうか?
(VB.NET のコントロールで flash を再生できるとベストなのですが)
2) SHFileOperation ですが、私の説明がまずかったのですが、
ファイルのコピーや移動が行ないたいのではなく、例えばエクスプローラなどで
ファイルのコピーを行なうと、アニメーションが表示されると思います。
これを、自前のアプリの中で同じように、何かの処理中にアニメーションを表示したいのですが
vb.net のアプリの中でアニメーションを表示させる定石みないな事があれば教えてください。
アドバイスのほど、よろしくお願いします。
0163デフォルトの名無しさん
2006/06/16(金) 11:10:181)無理
でも、古いバージョンのSWFなら標準のflashプラグインで行けるよ
2)AVIファイルを貼り付ける
0164デフォルトの名無しさん
2006/06/16(金) 11:10:25> そういった前提条件なく flash を再生する方法はないでしょうか?
> (VB.NET のコントロールで flash を再生できるとベストなのですが)
Flash は Microsoft の製品じゃない。
> これを、自前のアプリの中で同じように、何かの処理中にアニメーションを表示したいのですが
> vb.net のアプリの中でアニメーションを表示させる定石みないな事があれば教えてください。
アニメーションGIF 使うかタイマで書き換え。
0165デフォルトの名無しさん
2006/06/16(金) 12:33:15パソコンの存在を前提とせずにエクセルを使いたいのですが、
みたいな電波な質問をする人はこの世界入っちゃダメだと思うけど。
0166デフォルトの名無しさん
2006/06/16(金) 12:46:32誰にでもできるよ!できるよ!(AA略
0167デフォルトの名無しさん
2006/06/16(金) 13:11:01それはプログラミングでは無い
コードの編集作業だ
プログラミンは選ばれた者だけが行える至高の労働だ
0168デフォルトの名無しさん
2006/06/16(金) 13:54:27とは言えない罠。仕様書に沿ってアルゴリズムを組み上げて、ムダな
くムリなくバグも少ないコードが書けてこそだ。
0169デフォルトの名無しさん
2006/06/16(金) 15:03:21死んだじいちゃんに言われた。「コーダーだけにはなっちゃなんねぇ・・・」って
0170デフォルトの名無しさん
2006/06/16(金) 15:16:380171デフォルトの名無しさん
2006/06/16(金) 15:34:29ttp://pc8.2ch.net/test/read.cgi/prog/1150027539/
0172デフォルトの名無しさん
2006/06/16(金) 17:39:15宿題で、 「与えられた半角文字列中に含まれる単語のうち、 最も多く出現する単語を返す関数(MostFrequentWord) を作成しろ。条件として大文字、小文字を区別しない。
返される文字は最初に出現した表記。2つ以上の単語が
同数の場合、先に登場したものとする。 配列の考え方を利用せよ。」
という問題があるのですが、
この問題の前に、与えられた文字列中に含まれる単語の数を返す関数CountWords を作れという問題もあり、それは、何とか出来たのですが、 今回の問題に、この関数CountWords を利用して作成する。みたいな事らしいのです。
最終的に作成した関数MostFrequentWord を用いるとprint FrequentWord("I love you. You love me.")
実行結果 love となるように作るみたいです。
また 、 作成した CountWords を用いると、この場合
CountWords("I love you. You love me.")
実行結果は 6 と返されます。
分からない事があるのですが、 この与えられた文字列 "I love you. You love me."
は配列として考えることはできるのですか?
どなたか 教えて下さい
0173デフォルトの名無しさん
2006/06/16(金) 17:47:590174デフォルトの名無しさん
2006/06/16(金) 17:49:360175デフォルトの名無しさん
2006/06/16(金) 17:56:38文字列を配列として考えるのではなく、単語を配列の要素として考える。
6個の単語があるのだから、要素数6の配列が出来るよね。
6はループの回数とでもして使わせようとしてると予想。
既に答えが上がっているけど、せっかく書いたのでうp
0176デフォルトの名無しさん
2006/06/16(金) 19:33:170177デフォルトの名無しさん
2006/06/16(金) 20:12:43プログレスバーだっけ?
あれ使えばできる
0178デフォルトの名無しさん
2006/06/17(土) 21:27:550179デフォルトの名無しさん
2006/06/17(土) 22:12:210180デフォルトの名無しさん
2006/06/17(土) 22:51:320181デフォルトの名無しさん
2006/06/17(土) 22:57:520182デフォルトの名無しさん
2006/06/17(土) 23:39:07スマブラ(ネット対戦)
この3つ出来ますかね?
0183デフォルトの名無しさん
2006/06/17(土) 23:53:260184デフォルトの名無しさん
2006/06/17(土) 23:55:470185デフォルトの名無しさん
2006/06/18(日) 00:09:58コントローラやボールの移動、衝突判定など盛り沢山だ。
0186デフォルトの名無しさん
2006/06/18(日) 00:21:390187デフォルトの名無しさん
2006/06/18(日) 16:10:590188デフォルトの名無しさん
2006/06/18(日) 16:50:180189デフォルトの名無しさん
2006/06/18(日) 20:03:38移動とか当たり判定とか
0190デフォルトの名無しさん
2006/06/18(日) 22:04:110191デフォルトの名無しさん
2006/06/18(日) 22:06:310192デフォルトの名無しさん
2006/06/18(日) 22:07:270193デフォルトの名無しさん
2006/06/18(日) 22:49:470194デフォルトの名無しさん
2006/06/18(日) 22:52:290195デフォルトの名無しさん
2006/06/19(月) 16:55:22そのフォームで処理をすると、フォームが固まってしまいます。入力も受け付けてくれません。画面も真っ白になってしまいます。
ただ、バグを起こしているとか無限ループとかではありません。
途中で、メールを送るような処理をさせているのですが、メールもちゃんと送られています。
これでは、ユーザーからは、バグっているように見えてしまいます。これは何が原因なのでしょうか?また、対処法はあるのでしょうか?
ご存知の方、よろしくご教授願います。
0196デフォルトの名無しさん
2006/06/19(月) 16:59:420197デフォルトの名無しさん
2006/06/19(月) 17:48:55ループしてる処理があるなら、DoEvents入れてみるとか。
0198197
2006/06/19(月) 17:50:35http://www.atmarkit.co.jp/fdotnet/dotnettips/136doevents/doevents.html
こんな状態になってると思われる。
0199デフォルトの名無しさん
2006/06/19(月) 18:36:35どう贔屓目に見てもそういうのバグっていうんだよw
少なくともユーザーから見たらバグ以外のなんでもない。
こんなとこで自分を正当化して何になるんだよ
0200デフォルトの名無しさん
2006/06/19(月) 18:38:52DoEventsとかいってるヨタは無視してよろしい。
普通にスレッド起動して、重い処理はそこで実行するようにしましょう。
0201デフォルトの名無しさん
2006/06/19(月) 18:46:530202デフォルトの名無しさん
2006/06/19(月) 20:30:42CPU使用率見てみ
低ければリフレッシュで再描画とかしてみ
0203デフォルトの名無しさん
2006/06/19(月) 20:52:59Thread.Sleep(10000) とかな
0204デフォルトの名無しさん
2006/06/19(月) 22:19:15>>メールを送るような処理をさせているのですが、メールもちゃんと送られています。
かなり勘で言うけど、メールを送った後の応答待ちでフリーズかましているだけとか?
0205195
2006/06/20(火) 10:22:49みなさん、ご回答ありがとうございます。
処理には、確かに2時間かかります。それを一日に何度も繰り返します。
この処理中でも、バックアップ処理や他の業務アプリは正常に動いていました。
私もスレッドで処理したいのですが、設計書に「同期処理で行う」と書いてあるので
諦めました。
こういうのは、Windowsサービスにした方がいいと思うんですが、SEがWindowsサービスの
存在を知らないようです。
DoEvents、リフレッシュで再描画、BackgroundWorkerを試してみます。
みなさん、ありがとうございました。
0206ボンちゃん
2006/06/20(火) 10:26:45プロパティに値を設定しております。(色情報等)
ソースにはSiteMapDataSourceを使用しています。
Menuコントロール内のあるボタンをクリックすると、上記の設定が適用され
ボタンの色が変わります。
が、問題はその後なのです。
Menuボタンクリックによりコンテンツが表示されるのですが、その中で
違うページへ移動(ハイパーリンク等)すると、マスターメニューの
StaticSelectedStyleが適用されなくなってしまいます。(選択状態とならない)
具体的に表現すると。。。
・Menuコントロールによって大分類を選択する。
・選んだ大分類のボタン色が変わる。
・表示されたページ内で、小分類のリンクを選択する。
・小分類のページへ遷移すると、さきほど選んだ大分類のボタン色が初期状態に。
・本当は小分類のページへ遷移しても、大分類は選択されたままの状態にしたい。
といった感じです。
コンテンツページで遷移を行ってもマスターページのMenuコントロールボタン選択状態を
保つ方法はないでしょうか?
リクエストのurlとweb.sitemapを照らし合わせて、選択状態を管理しているのではと
考えているのですが、urlが変わると選択状態にならないみたいなので困っております。。。
根本的に間違っている可能性もあるので、似たような事を実現されている方、解決方法が分かる方
情報がありましたらよろしくお願いいたします。
0207デフォルトの名無しさん
2006/06/20(火) 11:46:050208デフォルトの名無しさん
2006/06/20(火) 12:19:50VBとVB.NETってどう違うんでしょう?
0209デフォルトの名無しさん
2006/06/20(火) 12:33:280210デフォルトの名無しさん
2006/06/20(火) 12:46:340211デフォルトの名無しさん
2006/06/20(火) 12:54:160212206
2006/06/20(火) 13:10:590213デフォルトの名無しさん
2006/06/20(火) 13:14:34良いけど、「実際に〜」って聞いてるから実際そうなった人がいないだけじゃない?
あと、再現する最少のソースをどっかに乗せるとかしないと
そういう質問はスルーされるよ
0214ボンちゃん
2006/06/20(火) 13:41:46その朕の質問に答えられないと申すか
0215デフォルトの名無しさん
2006/06/20(火) 14:12:38option strict = onにしてから、
そのサブプロシージャに文字列なり数値なりを渡すと文字列の場合でも数値の場合でも怒られるんですが、なぜ??
オーバーロードを解釈してないのかな?
0216デフォルトの名無しさん
2006/06/20(火) 18:27:31再現可能なコードぐらい出せよ。
0217デフォルトの名無しさん
2006/06/21(水) 17:44:05調べる方法はありますか?
PC_A のプログラムにて PC_B であるサービスが起動しているかを判断したいのですが。
方法があればアドバイス、よろしくお願いします。
0218デフォルトの名無しさん
2006/06/21(水) 19:07:540219VB初心者
2006/06/22(木) 09:56:09あるDLLを利用するのに、VB6では Anyキーワードを使っていました。軽い気持ちでAnyをそれぞれByRef B as Byte(),ByRef C as Char() と書き換えました。
※BもCも引数の受け渡しだけでなく、呼び出し先で書き換えられる仕様です。
期待する動きをしないので、デバック用のDLLを作って受け取った値をチェックすると...
紆余曲折をへて、Char配列は素直にString型で良い事が判明しましたが、Byte配列がうまくいきません。どなたか良い方法をご存知の方いませんでしょうか?
<DllImport("hBTR.DLL", EntryPoint:="TESTCALL", _
SetLastError:=True, CharSet:=CharSet.Unicode, ExactSpelling:=True, _
CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function TESTCALL( _
<MarshalAs(UnmanagedType.U2)> ByVal op As Int16, _ '値渡 OK
<MarshalAs(UnmanagedType.LPArray)> <[In](), Out()> ByRef pBP() As Byte, _'参照バイト配列 X
<MarshalAs(UnmanagedType.LPStr)> ByRef pDB As String, _ 'String ○
)as integer
Byte配列もStringで渡せば! と思ったのですが、戻り値に0が含まれると、そこで切れてしまいます。
呼び出し部分
dim b() as string:redim b(127)
dim c as string
c="ABC":b(0)=1
Ret = TESTCALL(0, b, c)
RetはDLLからの値を受け取っている。1番目の引数0も正しくDLLに送られている。2番目の引数は受け渡しは成功するが、受け取りに失敗。3番目の引数は受け渡し、受け取り成功
たかが128バイト
本番で利用するDLLはこの128バイトを設定領域として利用。
ユーザーが保持しなければいけない仕様orz
テストDLL側で本番のDLLをコールしたら成功w(DLLの機能は問題なし)
VB2005<byte配列>DLL
いい方法をご存知なかた教えてください。
0220デフォルトの名無しさん
2006/06/22(木) 10:07:49なので ByRef As Byte() を渡すと言う事は byte** を渡すという事。
0221VB初心者
2006/06/22(木) 10:18:46レス有難うございます。
ポインタのポインタですよね^^
バイト配列のポインタ(引数の受け渡し)は成功している(呼び出し先のDLLで確認)ので、問題はアンマネージコードとの関連部分
<MarshalAs(UnmanagedType.LPArray)> <[In](), Out()> ByRef pBP() As Byte, _'参照バイト配列 X
このあたりだと推測されます。
上のスレへの追加情報
DLL呼び出しで、呼び出し先で引数の値を変更する場合。ByValは利用できない。
0222デフォルトの名無しさん
2006/06/22(木) 10:20:380223デフォルトの名無しさん
2006/06/22(木) 10:24:420224VB初心者
2006/06/22(木) 10:40:54Delphi7ですが
type
tPB = record
pb:array[0..127] of byte;
end;
ptpb = ^tpb;//tPBの配列へのポインタ宣言
function TESTCDLL(op:word; var PPB:ptpb;var PDB:pchar): Integer; stdcall;
var
_PPB:tpb;
begin
copymemory (@_PPB.pb,PPB,128);//デバックの為ローカルへCopy
//本番のDLL
ret:=MainDLL(_op,_PPB.pb,_PDB.db);//_PPB.pbのバイト配列が戻ってくる
copymemory (PPB,@_PPB.pb,128);//ローカル領域のデータをバイト配列のポインタ領域へコピー
//引数と戻り値の内容が、一致している事を確認
0225デフォルトの名無しさん
2006/06/22(木) 11:08:58PDB 周りは不明だが、C に翻訳するとこんな感じか?
typedef struct _tPB {
char pb[128];
} tPB, *ptpb;
int TestCall(short op, ptpb PPB, char* PDB) {
int ret;
tPB _PPB;
CopyMemory(&(_PPB.pb), PPB, 128);
ret = MainDLL(op, _PPB.pb, _PDB.db);
CopyMemory(PPB, &(_PPB.pb), 128);
return ret;
}
だとしたらやはり ptpb はポインタのポインタにはならんな。ただのポインタだ。
0226VB初心者
2006/06/22(木) 11:29:08レス有難うございます。大変ありがたい....
delphiの特徴として 関数定義の引数にVar 宣言をするとそれが「参照型」になります
PPB:ptbp |(C)ptpb PPB //varをつけない場合 値渡し
var PPB:ptbp |(C) ptpb* PPB //var をつけた場合 <このようになります
※しかし、呼び出し元からは値を受け取れているのですよねorz...
同じ場所へ同じくCopyMemoryで値を戻して受け取れないのは何故だろう
このようなデバックコードを試しましたが、呼び出し元では
PPB.pb[0]:=100;NG //byte配列
PDB:="ABC";//String OK
と言う結果ですね...
http://msdn2.microsoft.com/ja-jp/library/23acw07k.aspx
このあたりの話なのでしょうか?
128byteで深遠に足を踏み入れてしまったw
0227デフォルトの名無しさん
2006/06/22(木) 11:41:51とすると今度は copymemory の引数がおかしいという事にならんか?
> copymemory (@_PPB.pb,PPB,128);//デバックの為ローカルへCopy
の第二引数が PPB になってるって事はコピー対象が ptpb/tPB* であって、
頭の 4 バイトに tPB へのポインタを含み残り 124 バイトは意味不明の 128 バイト、をコピーする事になるような。
0228VB初心者
2006/06/22(木) 12:14:25ちょっと整理してみました。少し戻ってVB2005のバイト配列にこのようなデバックコードを用意しました。
間違いがあればご指摘ください
Dim sbb() As Byte
ReDim sbb(128)
For i = 0 To 16
sbb(i) = CByte(i)
Next
DLLインポート部分の宣言
<MarshalAs(UnmanagedType.LPArray)> <[In](), Out()> ByRef pBP() As Byte,
バイト配列の参照型を宣言。バイト配列のポインタを受け渡している
Ret = TESTCALL(sbb)
○delphi 側
function test (var PPB:ptpb)//
var _PPB:tpb//変数部に実体を同じ大きさのメモリ確保
begin
copymemory (@_PPB.pb,PPB,128);//@はCの&に当たる
ウオッチによる参照
PPB addressの値
PPB^ 0,1,2,3,4,5,6,...
_PPB.pb 0,1,2,3,4,5,6,...
正しく呼び出し元から値が入ってきています。
問題はこの値が呼び出し元に戻らないのですorz
copymemory (PPB,@_PPB.pb,128);
Delphiからのメモリコピーは正しく終わっているように思われますが
VB側に戻らないようです...
0229デフォルトの名無しさん
2006/06/22(木) 12:16:19Byte() 持った構造体書いて(MarshalAs で固定長配列を指示して)、
Marshal.AllocCoTaskMem/Marshal.StructureToPtr でメモリにコピーして、
その IntPtr を ByRef で渡す。
てのが妥当かな。
0230デフォルトの名無しさん
2006/06/22(木) 12:37:35たぶん、
<[In](), Out()> ByVal pBP As Byte()
でいいんじゃない?
呼び出し先がずっとバッファのアドレスの値を保持していて、
好き勝手なタイミングで書き換えるとかじゃなければ。
(この場合、ガベコレを抑制しないとまずかったはず)
MarshalAs属性はいらないと思う。
0231VB初心者
2006/06/22(木) 12:42:00構造体については試してみました。いろいろ有難う
<MarshalAs(UnmanagedType.Struct)> この宣言をおこなうと参照型が使えなくなりますorz
Lptstructにすると実行時に Structを使いなさいとコンパイラに怒られる
Structを使う(byValになる)と保護しているメモリーに書き込みをしましたエラー...
話を単純化すると
バイト配列をDLLに渡して[バイト配列の帰り値]を受け取りたいだけなんですが....
MSの責任者教えてくださいw
0232VB初心者
2006/06/22(木) 12:47:04レス有難う
<[In](), Out()> ByVal pBP() As Byte, _
で試してみました。
ByVal はメモリ保護で実行時エラー ... orz
0233デフォルトの名無しさん
2006/06/22(木) 12:53:18ていうか Delphi の方を var で受ける意味あるの?
今でてるの見る限り一切無いはずなんだけど。
ptpb で受ける限り、var の有無にかかわらず pb への変更は呼び出し元でも有効なはず。
それともつけなきゃ暗黙で const になるとでも言うのか。
それならそれで ptpb じゃなくて var の tPB で受ければいい話のはずだし。
0234VB初心者
2006/06/22(木) 13:02:20var 演算子をつけない場合、delphiはヒープに引数を丸ごとコピーします。
ポインタの場合はどしているんだろう?汗
もともとVBからはポインタ、サイズは4Byteしかないので意味がないといえばそうかもしれません。
いずれにしてもVARを外して試してみますね。
0235VB初心者
2006/06/22(木) 13:20:35VAR をつけないと引数の受け取りも失敗します
さて、その後も調査した結果 Byte配列の1バイト目はデーターが
戻っていることが判明しました。
しかしながら、配列サイズが1となっていました。
ReDim Preserve sbb(127)このようにサイズを戻しても先頭以外は0になっていました。
やはりDLLのインポート宣言に何かが必要なようです...
0236VB初心者
2006/06/22(木) 18:30:59方法は配列を以下のように宣言して
Public Structure pBPstruc
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=128)> <FieldOffset(0)> Public ByteB() As Byte
End Structure 'pBPstruc
DLL インポート部では
<MarshalAs(UnmanagedType.LPArray)> ByRef pBP() As pBPstruc, _
ということでした。
StringやChar Stringbuffでは配列に0が入った場合、長さが小さくされてしまう。
今回、調査して感じた事ですが
DLLの多くは(供給)された物が多い中、VB6のコードでDLL呼出は成功しない。
今回、多言語でテストDLLを作って動作をシミュレーションする事が出来たので、VB側からの
データーの流れを確認できたのですが、VBだけの環境では厳しかったかもしれません。
ポインタがない言語ではいろいろとねorz...
なぜC# C++を使わないのか? それは(笑...
0237デフォルトの名無しさん
2006/06/22(木) 18:44:20バッファの先頭アドレスを渡す方法は>>230に書いた通りで間違ってないと思うよ。
MSDNライブラリにもそのように書いてあるし、今までそれで問題は出てないから。
それでエラーが出るとすれば、原因は他の部分でしょう。
後C文字列の先頭アドレスを渡すときもStringをByValで渡さないとだめね。
ただし、これは呼んだ先で文字列を変更しない場合だけね。(つまりOut属性は不可)
呼んだ先で文字列を変更したい場合はStringBuilderをByValで渡すようにする。
この辺りもMSDNライブラリに書いてあるよ。
非常に散漫で分かりにくいけど。
0238VB初心者
2006/06/22(木) 20:17:33レス有難うございます。
ポインタの値そのものは書き換えることはないので ByValということですね。
※以下アンマネージドコード DLLコールに限った話
<MarshalAs(UnmanagedType.LPStr)> ByRef pKb As String
ByRefでString文字列をDLLに渡して、又、受け取ることも出来ました。
String のままでは、ByValではコンパイラが実行時に止めてしまいますw
byref Stringを ByVal StringBufferでにしたほうが良いという理由はどういった事でしょうか?
よろしければ理由を書いていただけると助かります。
0239デフォルトの名無しさん
2006/06/22(木) 20:37:14コンパイラはコンパイル時にしか仕事しないはずだよ。
コンパイラだからねw
>byref Stringを ByVal StringBufferでにしたほうが良いという理由はどういった事でしょうか?
StringBuilderね。
上の方で誰か既に書いてるみたいだけど、参照型をByrefで渡すってことは
Cで言えばポインタ変数のアドレスを渡すってことになるから。
ちなみに参照型をByValで渡すことはポインタ変数の値(つまりアドレス)を
渡すことになる。(Stringの場合は例えばUTF8をANSIに変換したりする必要があるから
完全に正確な表現じゃないと思うけど。)
VB初心者さんが欲しいのはこっちなんじゃ?
0240VB初心者
2006/06/22(木) 23:48:07デバック時における実行時エラーがありますよw
最大の難関? をクリアーして現在VB2005で色々と楽しんでいます。
ちなみにストリング変換はマネージドコントロールにANSI変換を指定しているので、
変換する手間はかかりません。
DLLを通じてDBからのANSI2バイトコードが変換作業なしに
そのまま表示されまして、これはちょっと感動w
VB6では byte<>UniCode(String)が必要でしたからね(苦笑
ByRef と ByVal についてはマネージコードとの兼ね合いと実行時の動作で決めました。
ByValにすると 引き渡す型とマネージコードの不一致、もしくは実行時エラーが起こります(謎
いすれにしてもバイト配列の相互受け渡しができれば、あとは何がおきても拡張すれば出来ると確信しております。
0241デフォルトの名無しさん
2006/06/23(金) 00:20:02っていうか、そんな姿勢じゃ遠からず痛い目見るよ間違いなく
0242デフォルトの名無しさん
2006/06/23(金) 00:55:450243VB初心者
2006/06/23(金) 00:56:05ソースデバック時のエラーは実行時エラーではないのでしょうか?(汗
コンパイラが出すわけではないですが、統合環境(デバッカ)が出すものですね。
0244デフォルトの名無しさん
2006/06/23(金) 02:12:00C++でDLLを作ってみました。
void PiTest(int mul, unsigned char *buf, char *msg) {
for (int i = 0; i<PITEST_BUFSIZE; i++) buf[i] = buf[i] * mul;
strcpy_s(msg, PITEST_MSGSIZE, "PiTest - PiTestDLL Complited !"); }
VB2005からはこれでOKでした。
Declare Sub PiTest Lib "PiTestDLL.dll" (ByVal mul As Integer, _
<[In](), Out()> ByVal buf() As Byte, ByVal msg As StringBuilder)
DelphiはよくわからないがC++で書くと次のようになってるので話がややこしくなっていると思われます。
void test(int op, unsigned char **buf, char **msg)
文字列の戻りにStringBuilderを使わなくてもよかったのはchar **になっていたためでしょう。
stringは変更不可ですが別のstringに入れ替えるのはByRefで出来たというわけです。
0245デフォルトの名無しさん
2006/06/23(金) 07:47:35> <[In](), Out()> ByVal buf() As Byte, ByVal msg As StringBuilder)
そこの<[In](), Out()>も省略できるはず。
0246デフォルトの名無しさん
2006/06/23(金) 08:28:42呼び出し先で文字列をmodifyするときは本来Out属性つけないとまずいでしょ
0247デフォルトの名無しさん
2006/06/23(金) 09:20:20それらを統合したものってそのものなんだから。
0248デフォルトの名無しさん
2006/06/23(金) 12:20:41そんな餌で俺様が(
0249デフォルトの名無しさん
2006/06/23(金) 12:23:30StringBuilder はデフォで In, Out だよー。
0250デフォルトの名無しさん
2006/06/23(金) 16:57:53byte配列の方のことを言ってるのだと思う。MSDNに記述あり
>blittable 型の配列と、blittable 型のメンバだけを含むクラスは、最適化のために、
>マーシャリング時にコピーされるのではなく固定されます。
>これらの型は、呼び出し元と呼び出し先が同じアパートメントに属する場合には、
>In/Out パラメータとしてマーシャリングされるように見えることがあります。
>ただし、そのような型は実際には In パラメータとしてマーシャリングされるため、
>引数を In/Out パラメータとしてマーシャリングする必要がある場合には、
>InAttribute 属性と OutAttribute 属性を適用する必要があります。
blittableって辞書に無いけどMSの造語?
0251デフォルトの名無しさん
2006/06/23(金) 17:06:39> blittableって辞書に無いけどMSの造語?
ttp://www.answers.com/blit&r=67
Computer Jargon、IT俗語。
で、私もそう思ってたんだが、
実際にはプリミティブ型配列は(属性の指定にかかわらず)強制的に In, Out になるっぽいんだよね。
非プリミティブな構造体の配列だと In だけなんだけど。
0252デフォルトの名無しさん
2006/06/23(金) 18:45:20あそっかそいうやStringBuilderは例外扱いだったね。
■ このスレッドは過去ログ倉庫に格納されています