人に聞けない痔の悩み、これでスッキリ >>

VB6でAddressOfを使った良いサンプルを探しています。
コールバック?とか良く知りませんが絡んでいるのでしょうか?

VB6でアドレスに直接、見たり、書いたりできる関数はありますか?
昔、Peek poke関数があった気がするのですが・・・

あと、それを使うと間違いなく、Windowsが落ちますか?

A 回答 (1件)

AddressOf の主な使いみちとしては、EnumWindows 呼び出すとか、


SetWindowLong と組み合わせてサブクラス化するとか、あたりでしょう。
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/13 …

アドレスを直接読み書きするのは、VB6 単体では無理で、
C でちょっとした DLL を書いて呼び出してやるか、
API の RtlMoveMemory を使うか、
ReadProcessMemory/WriteProcessMemory API を使うか、あたりになります。
アドレスと値によっては、Windows が落ちる可能性もありますし、
有用な結果が得られることもあります。
    • good
    • 0

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

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

QVB.net Double と Decimal の違い?

VB.NETで開発しています
元々はC言語で開発してましたが、最近VB.NETをしています
で、以前誰かが作ったプログラムをデバッグしているんですが、その中に Double や Decimal が混じっています
どちらも 浮動小数点 と思うんですが 違いがいまいちわかりません
混じらせる利点ってないと思うんですが、どうなんでしょう?
有効桁数が違うとかだけだったら 簡単なんですが・・

Aベストアンサー

Doubleは俗に言う倍精度浮動小数点数と同じです。
精度重視したのか、Longより大きい値を表現できることを意識したのか、10進数型(Decimal)を使った理由(作者の意図)はこちらも良くわかりません。
Decimalを含むデータ型の説明は下記にあります。
データ型をクリックで詳細説明を参照できます。
http://msdn.microsoft.com/ja-jp/library/47zceaw7.aspx
 

QVB.NET デリゲートへのコールバック関数の設定

VB.NET デリゲートへのコールバック関数の設定

VB.NETとネイティブC/C++ DLL間でのコールバックについての質問です。
ネイティブDLLからVOID*で得られるコールバック関数をVB.NETのデリゲートに
登録するには、どのようにコーディングすればよいのでしょうか。

---------- VB.NETソース ----------

Public Delegate Sub CALLBACK_00(ByVal Arg1 As Integer, ByVal Arg2 As Integer)
Declare Function FuncPtrGet Lib "test.dll" () As CALLBACK_00
Dim Func As new CALLBACK_00(FuncPtrGet());

2行目は、実際にはVOID*が帰るDLL関数です。
3行目がコンパイルで通りません。AddressOfで関数を指定するようにメッセージが出ます。

Aベストアンサー

えーっと,Visual BasicではなくVisual Basic.NET (=Visual Basic 7.0 or 7.1) なのですか?
それだと,安全な呼び出し方法は存在しません。
C等で呼び出しようのヘルパーを用意することになると思います。


Visual Basic 8.0かそれ以降であるならば,
MSDN: Marshal.GetDelegateForFunctionPointer メソッド (System.Runtime.InteropServices)
http://msdn.microsoft.com/ja-jp/library/system.runtime.interopservices.marshal.getdelegateforfunctionpointer.aspx
という,正規の方法があります。

Declare Function FuncPtrGet Lib "test.dll" As IntPtr
に変更後,
Dim Func As CALLBACK_00 = DirectCast(Marshal.GetDelegateForFunctionPointer(FuncPtrGet(), GetType(CALLBACK_00)), CALLBACK_00)
とすることで,Funcは適切に設定されますので,安全にメソッドを呼び出すことが来ます。

えーっと,Visual BasicではなくVisual Basic.NET (=Visual Basic 7.0 or 7.1) なのですか?
それだと,安全な呼び出し方法は存在しません。
C等で呼び出しようのヘルパーを用意することになると思います。


Visual Basic 8.0かそれ以降であるならば,
MSDN: Marshal.GetDelegateForFunctionPointer メソッド (System.Runtime.InteropServices)
http://msdn.microsoft.com/ja-jp/library/system.runtime.interopservices.marshal.getdelegateforfunctionpointer.aspx
という,正規の方法があります。

Declare Fu...続きを読む

QForm_Load と Form_Activate のタイミング

あるデータ入力アプリを作っています。
親フォーム(Form0)で番号を決め、子フォーム(Form1,Form2,Form3,Form4) でデータ入力し、それぞれの子フォームを出るとき(Unload Me) に、変数にsaveしています。それを親フォーム(Form0)で登録を選択したとき、入力データをチェックしてDBに格納しています。
すでにDB格納済のデータの場合、親フォームでDBから変数に読み込み、子フォームのForm_Loadで展開しています。
そこで困っているのは、親と子のフォームを行き来するときにデータの表示で前のが残っていたり、消えてしまったりします。
Form_LoadとForm_Activateを通過するタイミングが、ちゃんと理解できていないためコードの記述位置が不適切なのだと思います。

Form_Load と Form_Activate の実行タイミングについて、お教えください。

Aベストアンサー

Form_Loadは、フォームがロードされたときです。
ロードされる条件は、
1.フォームがスタートアップに指定されているとき、アプリが実行された直後。
2.Show メソッドが呼ばれたとき
3.Loadメソッドが呼ばれたとき
4.フォームに貼り付けられたコントロールのプロパティが参照されたとき
5.フォームに貼り付けられたコントロールのメソッドが呼ばれたとき
です。

ただし、一度ロードされると、Unloadされるまで呼ばれません。


Form_Activateは、フォームがアクティブになったとき、つまり、キャプション(ウィンドウのタイトルバー)の色が変わったときです。

Qコールバック関数

VB6.0でコールバック関数みたいなのを呼び出して
別のプロシージャを作成する事ってできないでしょうか?

並列処理をさせたいのですが、あるdllを呼び出しくる際
戻り値が返ってくるのを待ってしまいその部分でラグが発生してしまいます。
そのdllに関してのみ別のプロシージャに投げて戻り値が返ってくるのを待たず、
戻り値をパブリック変数に順次格納していきたいのですがVB6.0 or .netで可能でしょうか?

VB6.0SP3
Windows2k

Aベストアンサー

ActiveX EXEによる非同期処理の実装はこちらをどうぞ。
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/0008/com/

あと、.netであれば、VB.NETでもスレッドが使用可能なので、同一プロセス内で非同期処理が可能です。

参考URL:http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/0008/com/

QVBでイベント処理を追加するには?

昔、ちょっとだけVBを使っていたことがあるのですが、最近はずっと別の言語を使っていた為、ど忘れしてしまいました。

たとえば、フォームのサイズ変更があったときの処理を追加するにはどうしたら良いのでしょうか?

Aベストアンサー

VB6.0でしょうか?.NETでしょうか?
.NETなら、ほとんど何もわかりませんので、パスです。(^^;

6.0なら、

Private Sub Form_ReSize()

でよいはずです。
このコードは、VBエディタ上でベタにタイプしてもよいのですが、IDEのインテリジェンス機能を有効に活用するなら、

(1) エディタ左上の「(General)」と表示されているコンボボックスを開き、「Form」を選択する。
(2) エディタ右上のコンボボックスで、「ReSize」を選択する。

の手順でOKです。

************************************************************************

以下、余談です。

上記(2)のコンボボックスで選択できないイベントは、VBの仕様上公開されていないイベント(Windowsメッセージ)ということになります。
(一例を挙げると、Formに対するWM_MOVEなど)
この場合は、サブクラス化という手法を使用してWindowsメッセージを取得することになります。

VB6.0でしょうか?.NETでしょうか?
.NETなら、ほとんど何もわかりませんので、パスです。(^^;

6.0なら、

Private Sub Form_ReSize()

でよいはずです。
このコードは、VBエディタ上でベタにタイプしてもよいのですが、IDEのインテリジェンス機能を有効に活用するなら、

(1) エディタ左上の「(General)」と表示されているコンボボックスを開き、「Form」を選択する。
(2) エディタ右上のコンボボックスで、「ReSize」を選択する。

の手順でOKです。

****************************************...続きを読む

QRedim とEraseの違いは?

VBA フォームのボタン クリックイベント時に書き込んだ記述で、次のような記述があります。
Dim temp() as string
ReDim temp(0)
(next processing)

一度、イベントを処理した後(フォームは閉じません。)
再度ボタンをクリックして同じコードを実行すると前に行ったデータが消去されずに残っているようです。
ReDimで Preserve宣言を使っていないので内容が消去されると考えていました。
ReDimのまえに、
Erase temp
という処理を設けて対応しますが、
ローカルウィンドウやウオッチウィンドウでメモリがクリアされたか確認できていません。
ReDimとEraseの処理でどのような違いがあるのでしょうか?

どなたかよろしくお願いします。

Aベストアンサー

----ヘルプより引用----
Eraseステートメント
固定サイズの配列の場合は要素を再初期化し、動的配列の場合は割り当てたメモリを解放します。
----------------------

今回は、動的配列なので、メモリ解放ですね。

----ヘルプより引用----
ReDim ステートメント
動的配列変数に対するメモリ領域の再割り当てを行います。プロシージャ レベルで使用します。
----------------------

通常は動的配列のサイズを変更する時に使います。
また、Preserve を付けない場合は値は残りません。

ReDim temp(0) ですが、Option Base 1 なら、エラーになります。
Option Base 0 (又は、省略)の場合、添え字 0 の要素が利用可能です。

UBound(temp) は 0 となります。
つまり、ReDimで配列の要素を 0 個にすることは出来ません。

ちなみに、Eraseした場合、UBound()はエラーになります。

Erase temp
Debug.Print UBound(temp) ' この行でエラー



>再度ボタンをクリックして同じコードを実行すると前に行ったデータが消去されずに残っているようです。

この部分が疑問ですね。

プロシージャ内で宣言した変数なら、プロシージャが終了した時点で捨てられるので、次のイベントに値が残ることはありません。

どこか別の場所に値が残っているのでは?

----ヘルプより引用----
Eraseステートメント
固定サイズの配列の場合は要素を再初期化し、動的配列の場合は割り当てたメモリを解放します。
----------------------

今回は、動的配列なので、メモリ解放ですね。

----ヘルプより引用----
ReDim ステートメント
動的配列変数に対するメモリ領域の再割り当てを行います。プロシージャ レベルで使用します。
----------------------

通常は動的配列のサイズを変更する時に使います。
また、Preserve を付けない場合は値は残りません。

ReDim temp...続きを読む

QVB6でマルチスレッド?

VB6で、2つの関数を同時に実行させる?方法が知りたいです。

例えば、A関数,B関数共に中でループしていて、プログラムで以下のように書いた場合、A関数が終了するまでB関数にいきません。
例1)
call A()
call B()

ボタンイベントにそれぞれA,B関数を書いて、Aボタン、Bボタンと押せば、両方の関数共、実行中になります。

これをボタンイベントでなくて、ブログラムで(例1のように)実行させたいのですが、どのように記述すればよいのでしょうか?

Aベストアンサー

DoEvents入れて互いに呼び合っているんですか?
デッドロックを招くのでVB(というかイベントドリブンのフレームワーク一般)でそういうコーディングはお勧めしません。

タイマーイベントのコールバックで少しずつ処理を進めるように作るのが一般的です。

Qエクセル マクロ実行時エラー’1004’

For~Next構文内でシートコピーしていると途中で、
実行時エラー'1004’
WorksheetクラスのCopyメソッドが失敗しました。
が表示されることがあります。

該当のFor~Next文は10回以上実行されているので、コードの誤りではないと思うのですが、なぜ「Copyメソッドが失敗」するのかわかりません。
理由/対処方法がわかればありがたいと思い質問させていただきます。

**該当コード**
Sub 評価シート作成()
  Sheets(社員一覧).Select
  行 = 1
  Do
    ReDim Preserve 社員CD(行)
    ReDim Preserve 氏名(行)
    社員CD(行) = Cells(行 + 1, 1).Value
    氏名(行) = Cells(行 + 1, 2).Value
    行 = 行 + 1
  Loop Until Cells(行, 1) = ""
  人数 = 行 - 2
  For 回数 = 1 To 人数
    Sheets(評価シート).Select
    Sheets(評価シート).Copy after:=Sheets(評価シート)
    ActiveSheet.Name = 氏名(回数)
    Cells(4, 5) = 氏名(回数)
    Cells(4, 3) = 社員CD(回数)
  Next 回数
End Sub
*****************************
よろしくお願いします

For~Next構文内でシートコピーしていると途中で、
実行時エラー'1004’
WorksheetクラスのCopyメソッドが失敗しました。
が表示されることがあります。

該当のFor~Next文は10回以上実行されているので、コードの誤りではないと思うのですが、なぜ「Copyメソッドが失敗」するのかわかりません。
理由/対処方法がわかればありがたいと思い質問させていただきます。

**該当コード**
Sub 評価シート作成()
  Sheets(社員一覧).Select
  行 = 1
  Do
    ReDim Preserve 社員CD(行)
   ...続きを読む

Aベストアンサー

ひょっとしてこれに該当するのかな?

Excel でプログラムを使用してワークシートをコピーするとランタイム エラー 1004 が発生する
http://support.microsoft.com/kb/210684/ja


人気Q&Aランキング