CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 2 of 2
  1. #1
    Join Date
    Apr 2004
    Posts
    2

    Question How to use COM Interop in C#

    I have a requirement to use a dll written in Visual C++ 6.0 in my C# application. In order to establish the link between my application and the dll, I have written a ATL COM Component in Visual C++.NET [visual studio .NET version 8]. This COM component is referenced in my C# application. The COM component statically links with the 6.0 dll.

    I am facing problems in passing data from C# to the dll through the COM component.

    Description:
    1. The dll exposes a function as:
    __declspec(dllexport) int __stdcall ProblemFunction(int param1, BYTE param2, BYTE param3, BYTE *param4, DWORD *param5);

    2. In the COM wrapper component, I have declared an interface method as:
    [id(25), helpstring("method ProblemFunc")] HRESULT ProblemFunc([in] SHORT param1, [in] BYTE param2, [in] BYTE param3, [in, out] BYTE* param4, [in, out] LONG* param5, [out, retval] BYTE* param6);

    where, param6 is used to return the value returned by dll function to the C# client application.

    The implementation of this interface function is given below:
    STDMETHODIMP
    Wrapper::ProblemFunc(SHORT param1, BYTE param2, BYTE param3, BYTE* param4, LONG* param5, BYTE* param6)
    {
    *param6 = ProblemFunction(param1, param2, param3, param4, (DWORD*)param5);
    return S_OK;
    }

    3. In the C# client application, I am calling the COM function as:
    byte returnValue = DllWrapperObject.ProblemFunc(value1, (byte)value2, (byte)value3, ref value4, ref value5);

    Here, I am facing problems passing value4 and value5 because:
    a. For value4 I need to pass a structure.
    b. For value5 I need to pass the size of the structure being passed in value4.

    The structure to be passed is as required by the dll. The C++ structure is:
    typedef struct
    {
    DWORD var1;
    DWORD var2;

    struct
    {
    DWORD var3;
    char var4[16];
    DWORD var5;
    } var6[3];
    } TEST_STRUCT;

    I wrote the structure's equivalent in C# as a class as I had to create an array. The C# implementation of the above given structure is:
    internal class InnerStruct
    {
    long var3;
    char[] var4 = new char[16];
    long var5;

    internal static int GetSizeOfClass()
    {
    return (sizeof(long) + sizeof(char) * 16 + sizeof(long));
    }
    }

    internal class TestStruct
    {
    long var1;
    long var2;
    InnerStruct[] var6 = new InnerStruct[3];

    internal static int GetSizeOfClass()
    {
    return (sizeof(long) * 2 + InnerStruct.GetSizeOfClass() * 3);
    }
    }


    Questions:
    1. Is there any better way to define the structure equivalent in C#?
    2. How can I get the size of the structure/class for passing it to the dll?
    3. How to pass the handle of the structure/class object from C# to the dll so that it can fill it up and return it to the client app for future usage?

  2. #2
    Join Date
    Dec 2005
    Posts
    31

    Re: How to use COM Interop in C#

    have you read this ?

    i found it really usefull when i was messing with c++ dlls and calling them from c# via a com wrapper.

    sounds similar although i quickly skimmed your post ;-)

    http://msdn.microsoft.com/library/de...uctssample.asp

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured