Solved

Probem Converting C/C++ Windows code to Visual C#

Posted on 2009-07-07
3
274 Views
Last Modified: 2012-05-07
The code Im trying to convert is shown below. It returns the pointer to a COM port in the variable "CommPort". The function "InitPort" is in a DLL and its signature is also shown below.

HANDLE CommPort = INVALID_HANDLE_VALUE;
int vReturn = InitPort(CommPort);

 __declspec(dllexport) int  InitPort(HANDLE &mhCommunicationPort);

Now this code works fine in the windows C/C++ application. "commPort" returns a pointer to a COM port as expected.

But I need to get this working in a visual C# application (dont ask why!).
Ive been told the equivalent of HANDLE in C# is IntPtr so Ive been trying this in my C# application.

[DllImport(@"MyFunctionDLL.dll")]
static extern int InitPort(IntPtr h);

IntPtr CommPort = new IntPtr(-1);
int vReturn = InitPort(CommPort);

but Im getting an exception somewhere in the bowels of the "InitPort" function.

Has anyone any idea why this may be failing?

I dont believe I should have to delve into the actual code of "InitPort" (not at this stage anyway) since I should just be trying to find the right datatype to match up the C# and C/C++ Windows code.
0
Comment
Question by:rangers99
[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
3 Comments
 
LVL 5

Accepted Solution

by:
Pablissimo earned 250 total points
ID: 24793267
Since the C code specifies that the handle's passed by reference, you could try changing the C# extern definition and the subsequent call:

[DllImport(@"MyFunctionDLL.dll")]
static extern int InitPort(ref IntPtr h);

IntPtr CommPort = new IntPtr(-1);
int vReturn = InitPort(ref CommPort);

What's the exception you're getting? Can't actually see the above change fixing it but it might be worth a go
0
 

Author Closing Comment

by:rangers99
ID: 31600540
Pablissimo

Many, many thanks. You've fixed it buddy. Cheers
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 24794611
You may think of a mixed assembly (dll) where managed C++ and unmanaged C++ were linked together.

Then the C# could call the managed functions of that assembly while the managed functions in the C++ mixed assembly could call the unmanaged functions without any problems.

See

http://msdn.microsoft.com/en-us/library/x0w2664k.aspx


Note, the mixed code dll is of project type CLR - Class Library. To use it in the C# add the dll file to the references.

See more at  http://www.ondotnet.com/pub/a/dotnet/2004/03/29/mcpp_part3.html?page=1

 
// C++ (all in one IJW assembly)
 
#include <iostream>
 
// the code below is only for compile
// use the C++ headers where InitPort function was supplied
 
typedef void *HANDLE;
#define INVALID_HANDLE_VALUE		((HANDLE)(-1))
 
int InitPort(HANDLE& cp)
{
   cp = ((HANDLE)(0));
   return 0;
}
 
namespace UnmanagedCode
{
   HANDLE InitPort()
   {
       HANDLE commPort = INVALID_HANDLE_VALUE;
       int vReturn = ::InitPort(commPort);
       if (vReturn == 0 && commPort != INVALID_HANDLE_VALUE)
          return commPort;
       return NULL; 
   }  
 
}
 
using System::IntPtr;
 
 
namespace ManagedCode
{
   public ref class InitPortWrapper
   {
      public:
         static IntPtr InitPort()
         {
            HANDLE h = UnmanagedCode::InitPort();
            IntPtr ip(h);
            return ip;
         }
   };
}
 
// C# code (seperate assembly)
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using ManagedCode;
 
 
namespace testinitport
{
    class Program
    {
        static void Main(string[] args)
        {
            IntPtr ip = InitPortWrapper.InitPort();
        }
    }
}
 

Open in new window

0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say 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

This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use for-loops in the C programming language.
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.

739 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