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

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