Solved

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

Posted on 2004-04-06
3
802 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 200 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

Announcing the Most Valuable Experts of 2016

MVEs are more concerned with the satisfaction of those they help than with the considerable points they can earn. They are the types of people you feel privileged to call colleagues. Join us in honoring this amazing group of Experts.

Question has a verified solution.

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

The object model of .Net can be overwhelming at times – so overwhelming that quite trivial tasks often take hours of research. In this case, the task at hand was to populate the datagrid from SQL Server database in Visual Studio 2008 Windows applica…
Recently while returning home from work my wife (another .NET developer) was murmuring something. On further poking she said that she has been assigned a task where she has to serialize and deserialize objects and she is afraid of serialization. Wha…
Come and listen to Percona CEO Peter Zaitsev discuss what’s new in Percona open source software, including Percona Server for MySQL (https://www.percona.com/software/mysql-database/percona-server) and MongoDB (https://www.percona.com/software/mongo-…
This is a high-level webinar that covers the history of enterprise open source database use. It addresses both the advantages companies see in using open source database technologies, as well as the fears and reservations they might have. In this…

690 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