RtlMoveMemory를 사용하여 VB6을 C #으로 변환

mjohns

기존 VB6 응용 프로그램을 C #으로 변환하려고합니다. 응용 프로그램은 VB6로도 작성되었으며 ActiveX DLL 인 API를 사용해야합니다. .NET Interop 기능을 사용하여이 API를 C #에서 사용할 수 있도록 래핑하고 있습니다.

문제는 바이트 배열을 가져온 다음 RtlMoveMemory ()를 사용하여 Struct로 이동하는 코드입니다. 아래에 제공된 C # 코드를 사용하면 System.ArgumentException "값이 예상 범위에 속하지 않습니다"예외가 발생합니다. 이 구현의 다양한 순열과 일부 마샬링을 시도했지만이 영역에 대한 내 심도를 약간 벗어났습니다. 내가 시도한 모든 것이 어떤 형태의 처리되지 않은 예외를 초래했습니다.

RtlMoveMemory ()를 사용하는 솔루션은 괜찮지 만 Marshalling을 사용하는 솔루션이 더 좋습니다. 바라건대 점을 연결하는 문제 일뿐입니다.

VB6 코드 :

Public Declare Sub MoveIt Lib "kernel32.dll" Alias "RtlMoveMemory" (dest As Any, src As Any, ByVal bytes As Long)

Type IntEventStruct
    TTag As Double
    quality As Long
    Value As Single
End Type


Dim byteBuff(PACKETSIZE - 1) As Byte
Dim dEvent As IntEventStruct


Call DWApi.ReadEvent(code, DBIndex, TTStr, interval, byteBuff, errMsg)
Call MoveIt(dEvent, byteBuff(0), Len(dEvent))

C # 코드 :

[DllImport("kernel32.dll", EntryPoint="RtlMoveMemory")]
static extern void MoveIt(Object Destination, Object Source, long Length);

public struct ReadEventStruct
{
    public double TimeTag;
    public int Quality;
    public float Value;
}

byte[] byteBuff = new byte[BUFFER_SIZE];
ReadEventStruct dwRead = new ReadEventStruct();

this.dw.ReadEvent(pt.Plant, pt.Index, pt.Time, pt.Interval, ref byteBuff, ref errMsg);
MoveIt(dwRead, byteBuff, Marshal.SizeOf(dwRead));

ReadEvent () 관련 API 문서 (소스 코드에 대한 액세스 권한이 없습니다) :

This routine retrieves process data for a specified point at a single time.
Calling convention:

Call DWPCAPI.ReadEvent(Plant As String, _
  iChannel As Long, _
  StartT As String, _
  Interval as Single, _
  Buffer() As Byte, _
  ErrMsg As String)

Buffer( ):  Byte buffer containing returned data.
mjohns

내 원래 질문에 대한 의견에 가장 좋은 답변이 제공되었습니다. BitConverter마샬링 대신 클래스를 사용하는 것이 좋지만 주석 작성자가 답변으로 제공하지 않았기 때문에 다음과 같습니다.

ReadEventStruct dwRead = new ReadEventStruct(); 
Array buffer = new byte[BUFFER_SIZE];

this.dw.ReadEvent(pt.Plant, pt.Index, pt.Time, pt.Interval, ref buffer, ref errMsg);

byte[] byteBuffer = (byte[])buffer;                         // Convert to byte[] so BitConverter class can be used

dwRead.TimeTag = BitConverter.ToDouble(byteBuffer, 0);      // First 8 bytes are TimeTag (double)
dwRead.Quality = BitConverter.ToInt32(byteBuffer, 8);       // Next 4 bytes are Quality (integer)
dwRead.Value   = BitConverter.ToSingle(byteBuffer, 12);     // Last 4 bytes are Value (float)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

interop을 사용하여 C ++를 C #으로 변환 시도

분류에서Dev

VB6는 VS2005를 사용하여 VB.net으로 변환합니다.

분류에서Dev

RestSharp를 사용하여 Curl을 C #으로 변환

분류에서Dev

VB6을 사용하여 Database Access 97을 Access 2003으로 변환 할 수 있습니까?

분류에서Dev

코드를 vb6에서 C #의 코드로 변환

분류에서Dev

C ++를 사용하여 csv 파일을 json으로 변환하는 방법

분류에서Dev

특성을 사용하여 C #의 개체를 JSON으로 변환

분류에서Dev

C를 사용하여 배열을 이진 트리로 변환?

분류에서Dev

C ++ Proj.4를 사용하여 Lat Long을 BNG로 변환

분류에서Dev

RSA를 사용하여 Java 코드를 C #으로 변환

분류에서Dev

VB6에서 C # 문자열 조작으로 변환

분류에서Dev

VB6의 Chr이 C #으로 변환 됨

분류에서Dev

Laravel 6 jquery를 사용하여 Ajax 응답으로 변환

분류에서Dev

VB를 사용하여 Decimal을 Hex로 변환하는 방법?

분류에서Dev

Jackson을 사용하여 JSONArray를 Map으로 변환

분류에서Dev

Spark / scala를 사용하여 문자열을 DataFrame으로 변환

분류에서Dev

Azure Logic App을 사용하여 CSV를 JSON으로 변환

분류에서Dev

Dispose ()를 사용하여 MovieClip을 비트 맵으로 변환

분류에서Dev

Dispose ()를 사용하여 MovieClip을 비트 맵으로 변환

분류에서Dev

sed를 사용하여 줄 바꿈을 공백으로 변환

분류에서Dev

Cordova (PhoneGap)를 사용하여 Android 앱을 IOS 앱으로 변환

분류에서Dev

Mule Custom Transformer를 사용하여 XML을 JSON으로 변환

분류에서Dev

XML 스키마를 사용하여 XML을 JSON으로 변환

분류에서Dev

정규식을 사용하여 WKT를 GeoJSON으로 변환

분류에서Dev

정규식을 사용하여 WKT를 GeoJSON으로 변환

분류에서Dev

PHP를 사용하여 배열을 json으로 변환

분류에서Dev

Matlab을 사용하여 tiff를 dicom으로 변환

분류에서Dev

중첩 배열을 사용하여 PHP를 JSON으로 변환

분류에서Dev

Java를 사용하여 ByteString을 Json으로 변환

Related 관련 기사

  1. 1

    interop을 사용하여 C ++를 C #으로 변환 시도

  2. 2

    VB6는 VS2005를 사용하여 VB.net으로 변환합니다.

  3. 3

    RestSharp를 사용하여 Curl을 C #으로 변환

  4. 4

    VB6을 사용하여 Database Access 97을 Access 2003으로 변환 할 수 있습니까?

  5. 5

    코드를 vb6에서 C #의 코드로 변환

  6. 6

    C ++를 사용하여 csv 파일을 json으로 변환하는 방법

  7. 7

    특성을 사용하여 C #의 개체를 JSON으로 변환

  8. 8

    C를 사용하여 배열을 이진 트리로 변환?

  9. 9

    C ++ Proj.4를 사용하여 Lat Long을 BNG로 변환

  10. 10

    RSA를 사용하여 Java 코드를 C #으로 변환

  11. 11

    VB6에서 C # 문자열 조작으로 변환

  12. 12

    VB6의 Chr이 C #으로 변환 됨

  13. 13

    Laravel 6 jquery를 사용하여 Ajax 응답으로 변환

  14. 14

    VB를 사용하여 Decimal을 Hex로 변환하는 방법?

  15. 15

    Jackson을 사용하여 JSONArray를 Map으로 변환

  16. 16

    Spark / scala를 사용하여 문자열을 DataFrame으로 변환

  17. 17

    Azure Logic App을 사용하여 CSV를 JSON으로 변환

  18. 18

    Dispose ()를 사용하여 MovieClip을 비트 맵으로 변환

  19. 19

    Dispose ()를 사용하여 MovieClip을 비트 맵으로 변환

  20. 20

    sed를 사용하여 줄 바꿈을 공백으로 변환

  21. 21

    Cordova (PhoneGap)를 사용하여 Android 앱을 IOS 앱으로 변환

  22. 22

    Mule Custom Transformer를 사용하여 XML을 JSON으로 변환

  23. 23

    XML 스키마를 사용하여 XML을 JSON으로 변환

  24. 24

    정규식을 사용하여 WKT를 GeoJSON으로 변환

  25. 25

    정규식을 사용하여 WKT를 GeoJSON으로 변환

  26. 26

    PHP를 사용하여 배열을 json으로 변환

  27. 27

    Matlab을 사용하여 tiff를 dicom으로 변환

  28. 28

    중첩 배열을 사용하여 PHP를 JSON으로 변환

  29. 29

    Java를 사용하여 ByteString을 Json으로 변환

뜨겁다태그

보관