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 Offline
    G Offline
    GerhardKreuzer
    wrote on last edited by
    #1

    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

    J OriginalGriffO S E S 6 Replies 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

      J Offline
      J Offline
      Jeremy Falcon
      wrote on last edited by
      #2

      GerhardKreuzer wrote:

      extern "C" { __declspec(dllexport) bool isDataLinkClear (void); }

      It's because of the extra spaces in this line.

      Jeremy Falcon

      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

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

        It's a long value, but the VB code requires a short - so you will need to zip the value - which should compress it nicely - and then pass it.

        "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

        P 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

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

          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 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

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

            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 1 Reply Last reply
            0
            • OriginalGriffO OriginalGriff

              It's a long value, but the VB code requires a short - so you will need to zip the value - which should compress it nicely - and then pass it.

              "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!

              P Online
              P Online
              PIEBALDconsult
              wrote on last edited by
              #6

              Better to remove the zero-bits because they are worthless anyway.

              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

                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