ファイルマッピングについての質問です。
現在CreatFileMapping、OpenFileMapping、MapViewOfFileをつかって
EXE間のデータのやり取りをしているのですが、
このファイルマッピングを利用して構造体を
やりとりする事は出来ないものでしょうか?
開発環境はWinNT4とVB6です。よろしくお願いします。

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

A 回答 (4件)

試してみました。



gOpenFileMappingMapViewOfFileFileMapReadFileMapWrite.vbpの変更点
---
Private Declare Sub MoveMemory Lib "kernel32.dll" _
Alias "RtlMoveMemory" _
(Destination As Any, _
Source As Any, _
ByVal Length As Long)

Private Type tyData
x As Long
y As Long
b(9999) As Byte
s As String * 1024
End Type
Private Data As tyData

Command1_Click()
Data.s = Text1.Text
' 文字列をコピー
Call MoveMemory(ByVal lngFileMapViewAddress, Data, Len(Data))

Command2_Click()
Data.s = ""
Call MoveMemory(Data, ByVal lngFileMapViewAddress, Len(Data))
Label3.Caption = RTrim(Data.s)

Command3_Click()
lngFileMapSizeLow = Len(Data)
---
普段はEXE間のデータはファイルで渡していますが、ファイルマッピングも
結構いいですね。今後、挑戦したいです。

この回答への補足

サンプルありがとうございます!
構造体受け渡し出来ました。こんどは二次元配列を送ってみようとしているんですが
構造体と同じやり方で出来るのでしょうか?今試しているのですが
どうにも上手くいきません(^^;

補足日時:2002/04/11 16:55
    • good
    • 0

>二次元配列



二次元配列を一つの構造体にするのが、手っ取り早いです。

Private Type tyData
x(100, 100) As Long
End Type

参考URL:http://support.microsoft.com/default.aspx?scid=% …
    • good
    • 0

試していませんが、lstrcopyをMoveMemoryに変更すればいいと思います。



構造体→ファイルマッピング
MoveMemory(lngFileMapViewAddress, 構造体,len(構造体))

ファイルマッピング→構造体
MoveMemory(構造体, lngFileMapViewAddress,len(構造体))

参考URL:http://www.vbvbvb.com/jp/gtips/0851/ggethostbyna …
    • good
    • 0

ファイルマッピングは経験ないけど


メモリブロックを渡すので、文字列であろうと構造体であろうと
同じだと思いますが、何か問題があるのでしょうか?

参考URL:http://www.vbvbvb.com/jp/gtips/1001/gOpenFileMap …

この回答への補足

まさにこのソースを使って作っているのですが、
書き込みに行くときのこのソースで言うText1.Textにあたる
部分を構造体にすると型が違うと言われます。
なのでバッファに当る変数の型を構造体型にしたところ
こんどは読み取り側で型が合わなくなります。読み取り側でバッファの型を
変えてもダメでした。現在そこで行き詰まっておりますm(_ _)m

補足日時:2002/04/10 20:34
    • good
    • 0

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

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

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

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

Q使用しているEXEファイルから、別のEXEファイルをクローズする方法

今現在簡単なプログラムを作成しておりまして、
TEST1.exeとTEST2.exeの二つのプログラムがあります。

TEST1.exeとTEST2.exeの二つのアプリケーションを起動
し、TEST1.exeが終了したら、TEST2.exeのアプリケー
ションも自動的に終了するようにしたいのですけど、何か
やり方ってありますでしょうか?

作成しているソフトはVB6.0/Win2000Proです。

よろしくお願いします。

Aベストアンサー

 CreateProcessプロセスというAPIで起動し
 TerminateProcessプロセスというAPIで終了させます

 以下に例を上げておきます。


'CreateProcess
'新しいプロセスを作り、実行ファイルを実行する。
'
'BOOL CreateProcess( LPCTSTR lpApplicationName,
' // pointer to name of executable module
'
' LPTSTR lpCommandLine,
' // pointer to command line string
'
' LPSECURITY_ATTRIBUTES lpProcessAttributes,
' // pointer to process security attributes
'
' LPSECURITY_ATTRIBUTES lpThreadAttributes,
' // pointer to thread security attributes
'
' BOOL bInheritHandles,
' // handle inheritance flag
'
' DWORD dwCreationFlags,
' // creation flags
'
' LPVOID lpEnvironment,
' // pointer to new environment block
'
' LPCTSTR lpCurrentDirectory,
' // pointer to current directory name
'
' LPSTARTUPINFO lpStartupInfo,
' // pointer to STARTUPINFO
'
' LPPROCESS_INFORMATION lpProcessInformation
' // pointer to PROCESS_INFORMATION
'
' );
'

Private Type PROCESS_INFORMATION

hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long

End Type

Private Type STARTUPINFO

cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long

End Type

Private Declare Function CreateProcess Lib "kernel32" Alias "CreateProcessA" (ByVal lpApplicationName As String, ByVal _
lpCommandLine As String, lpProcessAttributes As Any, lpThreadAttributes As Any, ByVal bInheritHandles As Long, _
ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long


Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwAccess As Long, ByVal fInherit As Integer, ByVal hObject _
As Long) As Long

Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long


Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long


Const SYNCHRONIZE = 1048576
Const NORMAL_PRIORITY_CLASS = &H20&

Dim pInfo As PROCESS_INFORMATION
Dim sInfo As STARTUPINFO
Dim sNull As String


Private Sub Command1_Click()
Dim success&
success& = CreateProcess(sNull, "Calc.exe", ByVal 0&, ByVal 0&, 1&, NORMAL_PRIORITY_CLASS, ByVal 0&, sNull, sInfo, pInfo)

End Sub

Private Sub Command2_Click()
Dim ret&
ret& = TerminateProcess(pInfo.hProcess, 0&)
ret& = CloseHandle(pInfo.hThread)
ret& = CloseHandle(pInfo.hProcess)

End Sub

 CreateProcessプロセスというAPIで起動し
 TerminateProcessプロセスというAPIで終了させます

 以下に例を上げておきます。


'CreateProcess
'新しいプロセスを作り、実行ファイルを実行する。
'
'BOOL CreateProcess( LPCTSTR lpApplicationName,
' // pointer to name of executable module
'
' LPTSTR lpCommandLine,
' // pointer to command line string
'
' LPSECURITY_ATTRIBUTES lpProcessAttributes,
' // pointer to process security attributes
'
' LPSEC...続きを読む

QVB6で開発されたアプリをVB2008に移植するには?

こんにちわ。よろしくお願いします。

早速ですが十年くらい前にVisual Basic(以下VB)6で開発されたアプリ(Windows用スタンドアロン。OLEコントロールやDBコントロールも使用)を無謀にも一足飛びにVB2008に移植する事になりました。

そこで質問なのですが…
1.VB2008のExpress Editionで可能でしょうか?
  もし無理ならどのEditionなら可能でしょうか?
2.多分、言語仕様もかなり違いがあると思うのですが、最も大きな違いや注意点があればお教え下さい。
  特に経験談・苦労談などをお聞かせくだされば有難いです。
3.VB6からVB2008への移植に関して特に有用と思われる書籍やWEBサイトがあればお教え下さい。

以上、独自のノウハウとして「秘中の秘」な事もあろうかと思いますが、「ヒントのヒ」だけでも教えて頂ければ幸いです。

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

Aベストアンサー

通りすがりと申します。

 vb6とvb.netは、開発思想も含めまったく別ものです。
 vb6は、構造化設計、vb.netはオブジェクト指向
 やろうと思えば、同じモジュールでもできると思いますが、コードは全て書き換えなければなりません。

 あと、Express Editionで可能かどうかは、開発しているvb6での開発時に有償ソフトを使用していた場合、Expressでは対応していない可能性があります。
 このようなソフトを使用する場合、有償のIDEを買わないと使用できないです。
 詳しくは、その製品サポートセンターへ問い合わせてください。

 あと、vb6だけでなく、それ以外に使用している環境も合わせて調査したほうがよいです。
 (たとえば、excelを使用している、dbの種類、XMLを操作している..など)
 これらも、接続方法、使用するライブラリ、相性などあります。
 
 dbについてもバージョンを上げるだけで、新たに見直さなければならないところも出てきます。

 たとえば、以前使用していたdbが内部でdmlを処理する時、シングルタスクで動作していたと
 過程します。バージョンアップ後、マルチタスクで動作するように改善されているとします。
 これだけでも、実行結果が異なる可能性があります。

 

 

通りすがりと申します。

 vb6とvb.netは、開発思想も含めまったく別ものです。
 vb6は、構造化設計、vb.netはオブジェクト指向
 やろうと思えば、同じモジュールでもできると思いますが、コードは全て書き換えなければなりません。

 あと、Express Editionで可能かどうかは、開発しているvb6での開発時に有償ソフトを使用していた場合、Expressでは対応していない可能性があります。
 このようなソフトを使用する場合、有償のIDEを買わないと使用できないです。
 詳しくは、...続きを読む

QVB6.0で作成したexeファイルが他のPCではエラーが発生して動きません

はじめまして。
色々検索してみたのですが、なかなか見つからなかったのでお力を貸していただければと思います。

仕事でVB6.0でつくられたプログラムがあります。
最初は別の方(仮にAさんとします)が作ってくださり、いつもそのexeファイルをもらって仕事をしておりました。
この度、私がそのプログラムを修正し、exeファイルを作成したところ、自分のPCでは問題なく動くのですが、他のPCで使用しようとするとエラーが発生して動きません。

プログラムはVB6.0で、指定したエクセルファイルを開いて参照し、データと照合させるものです。

AさんのPCのOSはwinXPです。
Aさんが作ってくれたexeファイルはコピーして、Win95/Win98/WinXPで問題なく動作することが出来ました。
しかし私が修正し、作成したexeファイルはOSは関係なく自分のPC以外ではエラーが発生してしまいます。ちなみに自分のPCもWinXPです。
エラーは「不正な処理をしている為、このプログラムを終了します」という様なものです。
エクセルを参照しようとすると、発生するエラーなので、そのときだとは思うのですが、デバックしようにも、自分のPCでは問題なく動いてしまうので、どうにも出来ません。

よろしくお願い申し上げます。

はじめまして。
色々検索してみたのですが、なかなか見つからなかったのでお力を貸していただければと思います。

仕事でVB6.0でつくられたプログラムがあります。
最初は別の方(仮にAさんとします)が作ってくださり、いつもそのexeファイルをもらって仕事をしておりました。
この度、私がそのプログラムを修正し、exeファイルを作成したところ、自分のPCでは問題なく動くのですが、他のPCで使用しようとするとエラーが発生して動きません。

プログラムはVB6.0で、指定したエクセルファイルを開い...続きを読む

Aベストアンサー

原因は 事前(アーリー)バインディングつまり参照設定をしているためです
yuzumiya氏のパソコンにはExcel2003、ターゲットパソコンにはExcel2000 ということですね

VBのアプリはExcel2003を探しているが見つからないので落ちてしまうのです

As Objectになおして EXcel2003への参照設定も外して EXEを作成してください

Q構造体に関するエラーについて(VB6.0→VB.NET)

私はプログラミング初心者なのですが、
モジュールAにて
Type test
A_test() As String
End Type
Global AAA As test

他の複数のモジュールにて
For i = 1 To 10
AAA.Atest(i) = "123"   ←(A)
Next i

VB6.0では上記のようなプログラムが問題無く動作するのですが、VB.net(2003)にてアップグレードし、実行すると他のモジュールの(A)のところにて"オブジェクト参照がオブジェクト インスタンスに設定されていません。"といったエラーが発生してしまいます。"AAA.A_test(i)"の値"Nothing"になっており、それが問題だと思うのですが対処法が分かりません。ご存知の方がおられましたら御教授宜しく御願いします。

Aベストアンサー

VB.NETはこれからの者ですが
http://dobon.net/i/vb/dotnet/vb6/structure.html
などがのっけから出てきて、VB6からの変更が大きい点のようです。
「VB.NET 構造体」で照会すると数百ヒットします。

参考URL:http://dobon.net/i/vb/dotnet/vb6/structure.html

QVB6でやると構造体の配列になる変数をVB2008では何で作ればいいか

VB6でプログラムを作っていたときは
値のセットが配列になるとき
構造体を動的配列で宣言してデータを足して作りました。

VB2008で開発をすることになり
同じようなことをしたいのですが
もっと便利なやり方が登場したりするのでしょうか?
クラスで挑戦したのですが動的配列はできないようでした。

Aベストアンサー

#書き連ねてたらやたら長くなってしまったので必要と思うところだけ抜粋して読んでくださいませ。

> できれば下記のようにしたかったので
> 同じようなことができないでしょうか?

■構造体+配列
Public Structure MainGroup
  Public ID As Integer
  Public SubGroups As SubGroup()
End Structure

Public Structure SubGroup
  Public ID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
  Public Sub New(ByVal ID As Integer, ByVal Value1 As Integer, ByVal Value2 As Integer)
    Me.ID = ID : Me.Value1 = Value1 : Me.Value2 = Value2
  End Sub
End Structure

Public Class Program
  Public Shared Sub Main()
    Dim DataArray As MainGroup() = {}
    Array.Resize(DataArray, 3)

    With DataArray(0)
      .ID = 1
      Array.Resize(.SubGroups, 4)
      .SubGroups(0) = New SubGroup(101, 123, 456)
      .SubGroups(1) = New SubGroup(102, 234, 567)
      ' (略)
    End With

    With DataArray(1)
      ' (略)
    End With
  End Sub
End Class

■クラス+コレクション
Public Class MainGroup
  Public ID As Integer
  Public SubGroup As New System.Collections.Generic.List(Of SubGroup)
End Class

Public Class SubGroup
  Public ID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
  Public Sub New(ByVal ID As Integer, ByVal Value1 As Integer, ByVal Value2 As Integer)
    Me.ID = ID : Me.Value1 = Value1 : Me.Value2 = Value2
  End Sub
End Class

Public Class Program
  Public Shared Sub Main()
    Dim DataList As New System.Collections.Generic.List(Of MainGroup)
    Dim NewMain As MainGroup

    NewMain = New MainGroup
    NewMain.ID = 1
    NewMain.SubGroup.Add(New SubGroup(101, 123, 456))
    NewMain.SubGroup.Add(New SubGroup(102, 234, 567))
    ' (略)
    DataList.Add(NewMain)
  End Sub
End Class

配列+クラスはNULL参照を発生させる可能性がある点で相性がよくありません。コレクション+構造体は、#2で挙げたようにデータ書き換えの手間がかかり、やはり相性はよくありません。
配列は要素数の変動に対してパフォーマンスが悪く、細かく増減させるには不向きです。コレクションは増減することを前提としている点や、削除した箇所を詰めたり途中に挿入したりが容易な点で優れています。
クラス or 構造体、配列 or コレクション をどう組み合わせるかはこれらのほか、ユーザビリティ・保守性・整合性・パフォーマンスなどと共に天秤にかけることになるでしょう。状況にあわせてうまく使い分けてください。


> addでどんどん追加して全体をループさせずに小項目IDを取得する方法

小項目IDがユニークであれば、リストコレクションではなく辞書コレクションを使うことでIDからクラスを取得できるようになります。クラスが保持しているデータをキーに使う場合は、コレクションを継承したクラスを作り、AddをShadowsで置き換えたほうがコーディングミスを防ぐことが出来ます。

■クラス+コレクションクラス
Public Class Group
  Public MainID As Integer
  Public SubID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
End Class

Public Class GroupCollection : Inherits System.Collections.Generic.Dictionary(Of Integer, Group)
  Public Shadows Sub Add(ByVal Item As Group)
    MyBase.Add(Item.SubID, Item)
  End Sub
End Class

Public Class Program
  Public Shared Sub Main()
    Dim DataDict As New GroupCollection
    Dim NewGroup As New Group
    NewGroup.MainID = 1
    NewGroup.SubID = 101
    NewGroup.Value1 = 123
    NewGroup.Value2 = 234

    DataDict.Add(NewGroup)

    Console.WriteLine(DataDict.Item(101).Value2) ' 出力 234
  End Sub
End Class

#書き連ねてたらやたら長くなってしまったので必要と思うところだけ抜粋して読んでくださいませ。

> できれば下記のようにしたかったので
> 同じようなことができないでしょうか?

■構造体+配列
Public Structure MainGroup
  Public ID As Integer
  Public SubGroups As SubGroup()
End Structure

Public Structure SubGroup
  Public ID As Integer
  Public Value1 As Integer
  Public Value2 As Integer
  Public Sub New(ByVal ID As Integer, ByVal Value1 As Integer, B...続きを読む


人気Q&Aランキング

おすすめ情報