ファイルマッピングについての質問です。
現在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&Aを見た人が検索しているワード

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

Qマッピングされたドライブとはどういう意味ですか?

http://www.symantec.com/region/jp/sarcj/data/w/w32.pinfi.html

このウイルスの事を調べています。
感染方法なのですが、マッピングされたドライブの意味がわからないので、教えていただけませんか?

Aベストアンサー

マッピングされたドライブ
||
ドライブレター(a:~z:)に紐付けられたネットワークドライブ

と理解するのが誤解が少ないと思います。

一般的には、Windows共有での「ネットワークドライブの割り当て」が多いですが、
それだけでなく、nfsやpcnfs、インターネット上のファイルを共有する仕組みが
存在するので、ドライブレターが振られた以上、それら全て危険であると考えるべきです。

w32.pinfiのウイルスは、全てのドライブレターとWindowsファイル共有を感染経路に利用する。
という意味です。

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...続きを読む

Qメールアドレスのマッピングの意味はなんですか?

ショップのサイトのフォームに内容を書いてメールアドレスを書いて送ったのですが、次のような文章が出ました。
「返信用メールアドレスのマッピング設定に誤りがあります」
このメールアドレスのマッピングというのを初めて聞きましたが一体なんなんでしょうか?  よろしくお願いします

Aベストアンサー

メールアドレスとして成立していない、という意味ではないかと思われます。
・全角文字・スペースが含まれている。
・「@」がない、または2つ以上ある。
など、確認してみてください。
頑張ってください(^o^)丿

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プロジェクションマッピングにおけるVJソフトの必要性を教えて下さい。

プロジェクションマッピングも手掛けるクリエイターさんのお話を聞く機会がありました。

プロジェクションマッピングでは、制作はAfter EffectsやPremiereなどの制作ソフトを使い、再生はVJソフトを使うそうですね。VJソフトというと、ライブなどで使用するイメージで、素人考えではマッピングさえしっかりできていれば、movやmp4などに書き出して再生するだけでいいのでは?と思ってしまいます(^^;

なぜプロジェクションマッピングでVJソフトが必要なのでしょうか?

Aベストアンサー

プロジェクションマッピングの作り方 : 最新VJ機材とVJソフトの情報
http://blog.livedoor.jp/vdmx5/archives/28803234.html

プロジェクションマッピングソフト
MadMapper http://www.madmapper.com/
他にResolume Arena, VPT.

[ケーススタディー] プロジェクションマッピングの現場から〜九州ソーシャルビジネスメッセ〜 - PRONEWS
http://www.pronews.jp/special/1305271300.html

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

Qillustratorのマッピングについて

illustratorはcs2を使っています。
参考書でillustratorを勉強しています。参考書どおりにやっているのですが・・・
マッピングするイメージをシンボルパレットにドラッグして登録し3Dオブジェクトにマッピングを設定したのですが、マッピングイメージの色変更の修正をしてもう一度「Alt」キーを押しながらドラッグして登録したシンボルに重ねると登録したシンボルは修正したものに変わっているのですが、同時にさきほど3Dオブジェクトにマッピングしてあったマッピングも変更されるはずなのですが・・・、何も変わりません。
どうしてでしょうか?アドバイスよろしくお願いいます。

Aベストアンサー

こんにちは!

CS3で確認しましたが、3Dでマッピングしたものはシンボルを修正してもすぐには更新されないようですね。
(普通に配置しているシンボルですと修正と同時に更新されます)

シンボルの変更と同時にインスタンスが更新される・・という説明はマッピングの部分で書かれていたのでしょうか?

違うページ・・つまり、ただのシンボルの説明のページではないですか?

この辺のところは詳しくはないので、どちらが正常なのかは分からないのですが、試してみたところ・・

マッピングした3Dオブジェクトを選択して、【アピアランスパネル】の『3D回転体?』をダブルクリックして一度ダイアログを出します。
そのままOKすれば更新を始めるようです。

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マッピングとは?

javaでCと併用したいので、JNAを使用しています。
使えるようにはなったのですが、定義がイマイチ良く分からないので、質問します。

ズバリ、マッピングとはなんですか?!

調べると、Cをjavaのインターフェースでマッピング。と説明されるのですが、
マッピングとはつまり、Cをオブジェクト化できるということでしょうか??
そして、なぜ、インターフェースでなければ、マッピングできないのですか??

あと、Cの処理内容をどこが行っているのですか??
ただ単に、Cそのものを動かして結果だけをとっているのでしょうか?
それとも、インターフェースがCのソース内容を読み込んで、
インターフェースがCの代わりに処理しているのでしょうか?
それが、マッピングということなのでしょうか??

ややこしい文章で申し訳ありません。
とても困っています。詳しい方がいましたら、どうかよろしくお願いいたします。

Aベストアンサー

マッピングとは対応付けのことです。JNAでは以下の対応付けをユーザーが行う必要があります。
・ライブラリのマッピング: ネイティブのライブラリ (.so, .dllなど) とJavaのインターフェイスの対応
・APIのマッピング: ネイティブの関数をJavaからどういう名前で呼ぶかの対応
・データ型のマッピング: ネイティブの関数の引数や返値の型をJava側のどのような型に結びつけるか (単純な型については予め決まっています)

>Cの処理内容をどこが行っているのですか??
>ただ単に、Cそのものを動かして結果だけをとっているのでしょうか?

その通りです。
そのため、CのコードをコンパイルしたネイティブのライブラリをNative.loadLibrary()で指定する必要があります。

Q[VB+DOSプロンプト]VBから .BAT ファイルを実行したい。

お世話になります~♪

VBであるソフト(ツール)を作っています。
途中でボタンをクリックして「jikkou.bat」を実行したいと考えています。

可能なのでしょうか?また、どのようにしてやればいいでしょうか?

いろいろやってみましたが、うまくいかないんです。
宜しくお願いいたします。

Aベストアンサー

メモ帳で
cd c:\windows
dir "c:\my documents"
calc
exit
を入力し、my documentsにaaa.batと名をつけ保存しました。
Private Sub CommandButton1_Click()
MsgBox "aaa実行"
Shell "c:\my documents\aaa.bat", vbNormalFocus
MsgBox "終了"
End Sub
を作り、ボタンをクリックしました。
実行され電卓が現われたりしました。
これでは良くご存知で質問するほどではないかと思うので、どの辺りにお困りですか。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング