Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. Export a 'long' from unmanaged code into .net

Export a 'long' from unmanaged code into .net

Scheduled Pinned Locked Moved The Lounge
questioncsharpcss
17 Posts 10 Posters 2 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • G GerhardKreuzer

    Hi, I have to export a 'long' value from an unmanaged dll to a VB app. I do this with other data types like int and bool, works fine, so I more or less know how do do it. When I do the same with 'long' the call crashes. Where there any samples out? What is so special with 'long'? Thanks for helping. With best regards Gerhard

    extern "C" { __declspec(dllexport) long GetCurrentFileRawFilePointer (void); }
    extern "C" { __declspec(dllexport) int AwaitCycleDoneFor (uint); }
    extern "C" { __declspec(dllexport) bool isDataLinkClear (void); }

    First line fails, other worked fine.

    Declare Function GetCurrentFileRawFilePointer Lib "GeoMon4D_iMX7.dll" () As Long
    Declare Function AwaitCycleDoneFor Lib "GeoMon4D_iMX7.dll" (timeout_ms As UInteger) As Integer
    Declare Function isDataLinkClear Lib "GeoMon4D_iMX7.dll" () As Boolean

    S Offline
    S Offline
    Shao Voon Wong
    wrote on last edited by
    #7

    Your long is actually a pointer. A pointer is unsigned 4 bytes or 8 bytes on 32-bit and 64-bit platform respectively. Long is always signed 64-bit integer on .NET. And you are not supposed to use a native file pointer in .NET to read/write to a file. Restrict your file operations to native code.

    extern "C" { __declspec(dllexport) void* GetCurrentFileRawFilePointer (void); }

    Declare Function GetCurrentFileRawFilePointer Lib "GeoMon4D_iMX7.dll" () As IntPtr

    1 Reply Last reply
    0
    • S Shuqian Ying

      I used C/C++ many years ago, as I recall that the long in C/C++ is actually 32 bits, the 64 bits type is called long long (or something like it), whereas long in .NET (and many other later languages) is 64 bits (see [here](<code>long</code>)[[^](<code>long</code>)]).

      K Offline
      K Offline
      k5054
      wrote on last edited by
      #8

      Many years ago, true (mostly). Today, at least on the 64 bit Archs (x86-64, arm-64, risc-v-64) I'm aware of, a long is 64 bits, as is a long long. And going back even further in time (8086 days), an int was 16 bits, and longs and long longs were 32 bits.

      Keep Calm and Carry On

      S J 2 Replies Last reply
      0
      • K k5054

        Many years ago, true (mostly). Today, at least on the 64 bit Archs (x86-64, arm-64, risc-v-64) I'm aware of, a long is 64 bits, as is a long long. And going back even further in time (8086 days), an int was 16 bits, and longs and long longs were 32 bits.

        Keep Calm and Carry On

        S Offline
        S Offline
        Shuqian Ying
        wrote on last edited by
        #9

        so they are referring to kind of physical unit rather than logical unit ...

        1 Reply Last reply
        0
        • E englebart

          If none of the other approaches work, consider a struct. struct MyLong { int hi; int lo; } In the C/C++ side you might be able to union with a long, but it is probably more platform portable to explicitly crack the long and assign the two members separately.

          K Offline
          K Offline
          Kate X257
          wrote on last edited by
          #10

          This is the way to do it. You could cast it, but it's never going to be as easy, safe and predictable as using a struct.

          OriginalGriffO 1 Reply Last reply
          0
          • K Kate X257

            This is the way to do it. You could cast it, but it's never going to be as easy, safe and predictable as using a struct.

            OriginalGriffO Offline
            OriginalGriffO Offline
            OriginalGriff
            wrote on last edited by
            #11

            This is the way. :RemovesHelmet:

            "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt AntiTwitter: @DalekDave is now a follower!

            "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
            "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt

            E 1 Reply Last reply
            0
            • K k5054

              Many years ago, true (mostly). Today, at least on the 64 bit Archs (x86-64, arm-64, risc-v-64) I'm aware of, a long is 64 bits, as is a long long. And going back even further in time (8086 days), an int was 16 bits, and longs and long longs were 32 bits.

              Keep Calm and Carry On

              J Offline
              J Offline
              jschell
              wrote on last edited by
              #12

              In C++ and probably C the type is going to be 'int64_t'. That is exactly 64 bits in all situations.

              1 Reply Last reply
              0
              • OriginalGriffO OriginalGriff

                This is the way. :RemovesHelmet:

                "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt AntiTwitter: @DalekDave is now a follower!

                E Offline
                E Offline
                englebart
                wrote on last edited by
                #13

                My other option was struct MyLong { int hi; uint lo; } You only need the sign in one spot. Am I right? :Reapplies Helmet: ? :Puts Helmet on head and fastens chin strap and lowers visor: ? What is the opposite of “Removes Helmet” that is just as concise?

                OriginalGriffO K 2 Replies Last reply
                0
                • E englebart

                  My other option was struct MyLong { int hi; uint lo; } You only need the sign in one spot. Am I right? :Reapplies Helmet: ? :Puts Helmet on head and fastens chin strap and lowers visor: ? What is the opposite of “Removes Helmet” that is just as concise?

                  OriginalGriffO Offline
                  OriginalGriffO Offline
                  OriginalGriff
                  wrote on last edited by
                  #14

                  englebart wrote:

                  What is the opposite of “Removes Helmet” that is just as concise?

                  "Equips helmet"?

                  "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt AntiTwitter: @DalekDave is now a follower!

                  "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
                  "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt

                  E 1 Reply Last reply
                  0
                  • OriginalGriffO OriginalGriff

                    englebart wrote:

                    What is the opposite of “Removes Helmet” that is just as concise?

                    "Equips helmet"?

                    "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt AntiTwitter: @DalekDave is now a follower!

                    E Offline
                    E Offline
                    englebart
                    wrote on last edited by
                    #15

                    I like it. Reminds me of a text based dungeon game!

                    1 Reply Last reply
                    0
                    • G GerhardKreuzer

                      Hi, I have to export a 'long' value from an unmanaged dll to a VB app. I do this with other data types like int and bool, works fine, so I more or less know how do do it. When I do the same with 'long' the call crashes. Where there any samples out? What is so special with 'long'? Thanks for helping. With best regards Gerhard

                      extern "C" { __declspec(dllexport) long GetCurrentFileRawFilePointer (void); }
                      extern "C" { __declspec(dllexport) int AwaitCycleDoneFor (uint); }
                      extern "C" { __declspec(dllexport) bool isDataLinkClear (void); }

                      First line fails, other worked fine.

                      Declare Function GetCurrentFileRawFilePointer Lib "GeoMon4D_iMX7.dll" () As Long
                      Declare Function AwaitCycleDoneFor Lib "GeoMon4D_iMX7.dll" (timeout_ms As UInteger) As Integer
                      Declare Function isDataLinkClear Lib "GeoMon4D_iMX7.dll" () As Boolean

                      G Offline
                      G Offline
                      GerhardKreuzer
                      wrote on last edited by
                      #16

                      Hi, lastly I found a working solution and its far from zipping data, thanks for that really good idea, but it was not April 1st, (and gives insight into your mindset). The embedded framework didn't support passing 64 bit values between managed and unmanaged code. A little workaround is needed. Fist create a new IntPnt object and pass this object to unmanged code by reference as parameter of some function. In unmanaged code use this pointer as any other pointer in C/C++, and assign the data you need. Return from this unmanaged function and use the 'Marshal' class to readout the value. Use a 'try finally' block to clean up memory in any case. Managed code:

                      Private Shared Function ReadFilePointer() As Long
                      Dim ptr As IntPtr = Marshal.AllocHGlobal(Len(New Long()))
                      Try
                      GetBookmark(ptr)
                      Return Marshal.ReadInt64(ptr)
                      Finally
                      Marshal.FreeHGlobal(ptr)
                      End Try
                      End Function

                      Unmanaged code:

                      extern "C" { __declspec(dllexport) void GetBookmark (intptr_t*); }

                      void GetBookmark(intptr_t* bmark)
                      {
                      *bmark = ftell(outFile);
                      }

                      Hope this can help someone someday. With best regards Gerhard

                      1 Reply Last reply
                      0
                      • E englebart

                        My other option was struct MyLong { int hi; uint lo; } You only need the sign in one spot. Am I right? :Reapplies Helmet: ? :Puts Helmet on head and fastens chin strap and lowers visor: ? What is the opposite of “Removes Helmet” that is just as concise?

                        K Offline
                        K Offline
                        Kate X257
                        wrote on last edited by
                        #17

                        your reasoning is sound, for one type of bit ordering I'd personally stick to int and unit test the conversion logic instead the details are easier to work out that way

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • Categories
                        • Recent
                        • Tags
                        • Popular
                        • World
                        • Users
                        • Groups