Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
?
Solved

Calling C Type DLL from VB.net to return Char() or String (passed as intptr)

Posted on 2004-04-06
3
Medium Priority
?
813 Views
Last Modified: 2011-10-03
How do I retrieve a string / char() value from a dll which only accepts IntPtr(at least all my other attempts failed with eroors) as Variable.
I have a perfectly fine working c/c++ code to call the c-type dll which goes as follows (Hope I include all the relevant parts):

typedef KPDCStatus (*KPDCGetAttributeInfoFunc)(
                  KPDCOpaqueRef inRef,
                  KPDCAttributeID inAttrID,
                  KPDCDataType *outAttrType,
                  KPDCUInt32 *outAttrSize);

typedef KPDCStatus (*KPDCGetAttributeValueFunc)(                                        
                  KPDCOpaqueRef inRef,                                    
                  KPDCAttributeID inAttrID,
                  KPDCUInt32 *inOutAttrSize,
                  void* outAttrValue);

//The functions are loaded into the theProcs-Structure

char theMemoryPath[255];

theStatus = theProcs.GetAttributeInfo(theCamera, KPDCSerialNumberStringID,&theDataType, &theAttributeSize );

// Now get actual serial number and store it in the memory path
memset(theMemoryPath, 0, sizeof(theMemoryPath) );
theStatus = theProcs.GetAttributeValue( theCamera, KPDCSerialNumberStringID,&theAttributeSize, theMemoryPath);

The function returns : P14N-15076 (That's what I want)


Trying to transfer this call to VB.net my current version looks like this (aftertaking many forms in the meantime, trying some MarshalAs and whatever I read about the topic):

    <DllImport("DCSPro4SLR.dll")> Shared Function KPDCGetAttributeInfo(ByVal inRef As IntPtr, _
               ByVal inAttrID As UInt32, ByRef outAttrType As UInt32, ByRef outAttrSize As UInt32) As Integer
    End Function

    <DllImport("DCSPro4SLR.dll")> Shared Function KPDCGetAttributeValue(ByVal inRef As IntPtr, _
               ByVal inAttrID As UInt32, ByRef inOutAttrSize As UInt32, ByRef outAttrValue As IntPtr) As Integer
    End Function
'The KPDCGetAttributeValue Function is the one troubling me

Private sub Test
            theStatus = KPDCGetAttributeInfo(theCamera, Convert.ToUInt32(KPDCCamAttr.KPDCSerialNumberStringID), _
                    theDataType, theAttributeSize)

            Dim tmpMemPath As IntPtr = Nothing
            theMemoryPath = ""

            theStatus = KPDCGetAttributeValue(theCamera, Convert.ToUInt32(KPDCCamAttr.KPDCSerialNumberStringID), _
                      theAttributeSize, tmpMemPath)
end sub

Everything seems to work fine. The returned status is OK, similar to the c call, theAttributeSize changes from 11 to 10, but I can't find a way to get the string value based on the tmpMemPath = 1312043344 value returned by the function.
E.g. trying:
      theMemoryPath = Marshal.PtrToStringAuto(tmpMemPath)                  
 yields "" while all the other versions of Marhal.PtrToString...(tmpMemPath [,]) result in an reference not set to an object exception.
Just ask if additional information is needed.
0
Comment
Question by:Der_Steppenwolf
  • 2
3 Comments
 
LVL 48

Accepted Solution

by:
AlexFM earned 800 total points
ID: 10772031
In C code you allocate memory for output outAttrValue parameter:

char theMemoryPath[255];
memset(theMemoryPath, 0, sizeof(theMemoryPath) );
theStatus = theProcs.GetAttributeValue( theCamera, KPDCSerialNumberStringID,&theAttributeSize, theMemoryPath);

In VB you just pass NULL-pointer:
Dim tmpMemPath As IntPtr = Nothing
theStatus = KPDCGetAttributeValue(theCamera, Convert.ToUInt32(KPDCCamAttr.KPDCSerialNumberStringID), _
                      theAttributeSize, tmpMemPath)

Allocate memory by the same way as in C:

Dim tmpMemPath As IntPtr
tmpMemPath = Marshal.AllocHGlobal(255)
theStatus = KPDCGetAttributeValue(theCamera, Convert.ToUInt32(KPDCCamAttr.KPDCSerialNumberStringID), _
                      theAttributeSize, tmpMemPath)

Now try to extract valur written to tmpMemPath by KPDCGetAttributeValue.

0
 

Author Comment

by:Der_Steppenwolf
ID: 10777544
Thanxs for the quick help, one additional twist was, that the outAttrValue has to be passed as ByVal rather than ByRef. Based on your answer I finally grabbed the concept of passing pointers to dll :-)
0
 
LVL 48

Expert Comment

by:AlexFM
ID: 10780776
Right. I didn't see this.

ByVal outAttrValue As IntPtr        void* outAttrValue        
ByRef outAttrValue As IntPtr        void** outAttrValue
0

Featured Post

Receive 1:1 tech help

Solve your biggest tech problems alongside global tech experts with 1:1 help.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Welcome my friends to the second instalment and follow-up to our Minify and Concatenate Your Scripts and Stylesheets (http://www.experts-exchange.com/Programming/Languages/.NET/ASP.NET/A_4334-Minify-and-Concatenate-Your-Scripts-and-Stylesheets.html)…
In real business world data are crucial and sometimes data are shared among different information systems. Hence, an agreeable file transfer protocol need to be established.
This Micro Tutorial will teach you how to add a cinematic look to any film or video out there. There are very few simple steps that you will follow to do so. This will be demonstrated using Adobe Premiere Pro CS6.
In a question here at Experts Exchange (https://www.experts-exchange.com/questions/29062564/Adobe-acrobat-reader-DC.html), a member asked how to create a signature in Adobe Acrobat Reader DC (the free Reader product, not the paid, full Acrobat produ…

564 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question