?
Solved

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

Posted on 2004-04-06
3
Medium Priority
?
804 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 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

Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

In my previous two articles we discussed Binary Serialization (http://www.experts-exchange.com/A_4362.html) and XML Serialization (http://www.experts-exchange.com/A_4425.html). In this article we will try to know more about SOAP (Simple Object Acces…
Many of us here at EE write code. Many of us write exceptional code; just as many of us write exception-prone code. As we all should know, exceptions are a mechanism for handling errors which are typically out of our control. From database errors, t…
Michael from AdRem Software explains how to view the most utilized and worst performing nodes in your network, by accessing the Top Charts view in NetCrunch network monitor (https://www.adremsoft.com/). Top Charts is a view in which you can set seve…
In this brief tutorial Pawel from AdRem Software explains how you can quickly find out which services are running on your network, or what are the IP addresses of servers responsible for each service. Software used is freeware NetCrunch Tools (https…
Suggested Courses

770 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