C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 6.0→VB.NET 変換 RtlMoveMemory


(過去ログ 28 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■13532 / inTopicNo.1)  6.0→VB.NET 変換 RtlMoveMemory
  
□投稿者/ セイン (65回)-(2008/01/30(Wed) 18:39:10)

分類:[VB.NET/VB2005] 

2008/01/30(Wed) 18:54:33 編集(投稿者)
2008/01/30(Wed) 18:40:10 編集(投稿者)

<pre><pre>いつもありがとうございます。
VB6.0からVB.NETに変換したのですが、RtlMoveMemoryの部分でうまくいきませんでした。
調べてみると、型指定なしのAnyが理由というところまではわかりましたので、型を明示するように変更しました。
(やりたいのは、dibをグローバルロックしてグローバルハンドルを取って、BMPファイルに出力)

VB6.0-------------------------------------------------
Public Declare Sub RtlMoveMemory Lib "kernel32" (Destination As Any, Source As Any, ByVal Length As Long)
Dim bmf As BITMAPFILEHEADER
Dim bmi As BITMAPINFOHEADER
Dim handle As Long

handle = GlobalLock(dib)

'BITMAPINFOHEADERの取得
RtlMoveMemory bmi, ByVal handle, Len(bmi)
-------------------------------------------------

VB.NET-------------------------------------------------
Public Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As BITMAPINFOHEADER, ByVal Source As IntPtr, ByVal Length As Integer)

Dim bmf As BITMAPFILEHEADER
Dim bmi As BITMAPINFOHEADER
Dim handle_Renamed As Long

handle_Renamed = GlobalLock(dib)

'BITMAPINFOHEADERの取得
RtlMoveMemory(bmi, handle_Renamed, Len(bmi))
-------------------------------------------------

このような変更でよいのでしょうか?
また、上記の変更でこの部分はうまくいくようになったのですが、同じことを他の部分にやろうとすると、エラーが起こります。
Public Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Byte, ByRef Source As Integer, ByVal Length As Integer)
Public Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Byte, ByRef Source As Short, ByVal Length As Integer)
Public Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Byte, ByVal Source As IntPtr, ByVal Length As Integer)

error BC30203: 識別子が必要です。
error BC30519: 縮小変換しないで呼び出される、アクセス可能な 'RtlMoveMemory' がないため、オーバーロードの解決に失敗しました:

1行目2行目と、3行目の区別ができないためですよね?
何か良い対策はあるのでしょうか?
</pre></pre>
引用返信 編集キー/
■13533 / inTopicNo.2)  Re[1]: 6.0→VB.NET 変換 RtlMoveMemory
□投稿者/ セイン (66回)-(2008/01/30(Wed) 19:26:17)
解決はしたのですが、
IntPtrだけをCopyMemoryに変更すればできてしまったのですが、
これが良い方法なのか、邪道なのかがわかりません。
アドバイス願います。

Public Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Byte, ByRef Source As Integer, ByVal Length As Integer)
Public Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Byte, ByRef Source As Short, ByVal Length As Integer)
Public Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Byte, ByVal Source As IntPtr, ByVal Length As Integer)


Public Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Byte, ByRef Source As Integer, ByVal Length As Integer)
Public Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Byte, ByRef Source As Short, ByVal Length As Integer)
Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByRef Destination As Byte, ByVal Source As IntPtr, ByVal Length As Integer)
引用返信 編集キー/
■13542 / inTopicNo.3)  Re[1]: 6.0→VB.NET 変換 RtlMoveMemory
□投稿者/ よねKEN (113回)-(2008/01/30(Wed) 23:09:16)
> VB.NET-------------------------------------------------
> Public Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As BITMAPINFOHEADER, ByVal Source As IntPtr, ByVal Length As Integer)
>
> Dim bmf As BITMAPFILEHEADER
> Dim bmi As BITMAPINFOHEADER
> Dim handle_Renamed As Long
>
> handle_Renamed = GlobalLock(dib)
>
> 'BITMAPINFOHEADERの取得
> RtlMoveMemory(bmi, handle_Renamed, Len(bmi))
> -------------------------------------------------
>
> このような変更でよいのでしょうか?

Dim handle_Renamed As Long
がまずいと思います。ポインタを扱うならAs LongではなくAs IntPtrを使いましょう。
(それにあわせてGlobalLockのDeclareも修正がたぶん必要になるでしょう)

ちなみにVB6のLongは32bit、.NETのLongは64bitです。

> また、上記の変更でこの部分はうまくいくようになったのですが、同じことを他の部分にやろうとすると、エラーが起こります。
> Public Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Byte, ByRef Source As Integer, ByVal Length As Integer)
> Public Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Byte, ByRef Source As Short, ByVal Length As Integer)
> Public Declare Sub RtlMoveMemory Lib "kernel32" (ByRef Destination As Byte, ByVal Source As IntPtr, ByVal Length As Integer)
>
> error BC30203: 識別子が必要です。
> error BC30519: 縮小変換しないで呼び出される、アクセス可能な 'RtlMoveMemory' がないため、オーバーロードの解決に失敗しました:

先の提示コードと同じような形であればhandle_RenamedがLong型だから、
ぴったりのオーバーロードが見つからないためでしょう。

引用返信 編集キー/
■13549 / inTopicNo.4)  Re[2]: 6.0→VB.NET 変換 RtlMoveMemory
□投稿者/ セイン (67回)-(2008/01/31(Thu) 09:06:02)
No13542 (よねKEN さん) に返信
なるほど!型違いですか!
たしかにLong型をIntPtrに変換できるので、動くには動いていたが、
ぴったり一致ではなかったので、変なエラーが出てたんですね。

ありがとうございました。
解決済み
引用返信 編集キー/
■13551 / inTopicNo.5)  Re[3]: 6.0→VB.NET 変換 RtlMoveMemory
□投稿者/ よねKEN (114回)-(2008/01/31(Thu) 10:03:00)
先の投稿で書き忘れましたが、今回の内容ならWindows APIを使う代わりに
Marshalクラスが使えると思います。参考までに。

Marshalクラス
http://msdn2.microsoft.com/ja-jp/library/system.runtime.interopservices.marshal_members(VS.80).aspx

今回の内容なら以下のメソッドでしょうか。
Marshal.Copyメソッド/Marshal.StructureToPtr メソッド/Marshal.PtrToStructure メソッド
Marshal.AllocHGlobalメソッド/Marshal.FreeHGlobalメソッド
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -