• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            C++ Programmer's Cookbook

            {C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

            struct在p/invoke中的轉化


            在msdn上發現很好的實例,與大家共享!

            enum調用實例:
            // Unions.cs

            using System;
            using System.Runtime.InteropServices;

            /*
            union MYUNION
            {
                
            int i;
                
            double d;
            };
            */

            [ StructLayout( LayoutKind.Explicit )]
            public struct MyUnion 
            {
                [ FieldOffset( 
            0 )]
                
            public int i;
                [ FieldOffset( 
            0 )]
                
            public double d;
            }

            /*
            union MYUNION2
            {
                
            int i;
                char str[
            128];
            };
            */

            [ StructLayout( LayoutKind.Explicit, Size
            =128 )]
            public struct MyUnion2_1 
            {    
                [ FieldOffset( 
            0 )]
                
            public int i;
            }

            [ StructLayout( LayoutKind.Sequential )]
            public struct MyUnion2_2 
            {    
                [ MarshalAs( UnmanagedType.ByValTStr, SizeConst
            =128 )] 
                
            public String str;
            }

            public class LibWrap
            {
                
            // void TestUnion(MYUNION u, int type)
                
                [ DllImport( 
            "..\\LIB\\PinvokeLib.dll" )]
                
            public static extern void TestUnion( MyUnion u, int type );
                
                
            // void TestUnion( MYUNION u, int type )
                
                [ DllImport( 
            "..\\LIB\\PinvokeLib.dll" )]
                
            public static extern void TestUnion2( MyUnion2_1 u, int type );
                
                
            // void TestUnion(MYUNION u, int type)
                
                [ DllImport( 
            "..\\LIB\\PinvokeLib.dll" )]
                
            public static extern void TestUnion2( MyUnion2_2 u, int type );        
            }

            public class App
            {
                
            public static void Main()
                {
                    MyUnion mu 
            = new MyUnion();
                    mu.i 
            = 99;
                    LibWrap.TestUnion( mu, 
            1 );
                    
                    mu.d 
            = 99.99;
                    LibWrap.TestUnion( mu, 
            2 );
                    
                    MyUnion2_1 mu2_1 
            = new MyUnion2_1();
                    mu2_1.i 
            = 99;
                    LibWrap.TestUnion2( mu2_1, 
            1 );
                    
                    MyUnion2_2 mu2_2 
            = new MyUnion2_2();
                    mu2_2.str 
            = "*** string ***";
                    LibWrap.TestUnion2( mu2_2, 
            2 );        
                }
            }

            struct調用實例:
            // Structs.cs

            using System;
            using System.Runtime.InteropServices;

            /*
            typedef struct _MYPERSON
            {
                char
            * first; 
                char
            * last; 
            } MYPERSON, 
            *LP_MYPERSON;
            */

            [ StructLayout( LayoutKind.Sequential, CharSet
            =CharSet.Ansi )]
            public struct MyPerson 
            {
                
            public String first; 
                
            public String last;
            }

            /*
            typedef struct _MYPERSON2
            {
                MYPERSON
            * person;
                
            int age; 
            } MYPERSON2, 
            *LP_MYPERSON2;
            */

            [ StructLayout( LayoutKind.Sequential )]
            public struct MyPerson2 
            {
                
            public IntPtr person;
                
            public int age;
            }

            /*
            typedef struct _MYPERSON3
            {
                MYPERSON person;
                
            int age; 
            } MYPERSON3;
            */

            [ StructLayout( LayoutKind.Sequential )]
            public struct MyPerson3 
            {
                
            public MyPerson person;
                
            public int age;
            }

            /*
            typedef struct _MYARRAYSTRUCT
            {
                bool flag;
                
            int vals[ 3 ]; 
            } MYARRAYSTRUCT;
            */

            [ StructLayout( LayoutKind.Sequential )]
            public struct MyArrayStruct 
            {
                
            public bool flag;
                [ MarshalAs( UnmanagedType.ByValArray, SizeConst
            =3 )] 
                
            public int[] vals;
            }

            public class LibWrap
            {
                
            // int TestStructInStruct(MYPERSON2* pPerson2);
                
                [ DllImport( 
            "..\\LIB\\PinvokeLib.dll" )]
                
            public static extern int TestStructInStruct( ref MyPerson2 person2 );
                
                
            // void TestStructInStruct3(MYPERSON3 person3)
                
                [ DllImport( 
            "..\\LIB\\PinvokeLib.dll" )]
                
            public static extern int TestStructInStruct3( MyPerson3 person3 );    
                
                
            // void TestArrayInStruct( MYARRAYSTRUCT* pStruct );
                
                [ DllImport( 
            "..\\LIB\\PinvokeLib.dll" )]
                
            public static extern int TestArrayInStruct( ref MyArrayStruct myStruct );    
            }

            public class App
            {
                
            public static void Main()
                {
                    
            // ******************* structure with pointer to other structure ************
                    MyPerson personName;
                    personName.first 
            = "Sue";
                    personName.last 
            = "Black";
                    
                    MyPerson2 personAll;
                    personAll.age 
            = 30;
                    
                    IntPtr buffer 
            = Marshal.AllocCoTaskMem( Marshal.SizeOf( personName ));
                    Marshal.StructureToPtr( personName, buffer, 
            false );
                    
                    personAll.person 
            = buffer;
                    
                    Console.WriteLine( 
            "\nPerson before call:" );
                    Console.WriteLine( 
            "first = {0}, last = {1}, age = {2}"
                        personName.first, personName.last, personAll.age ); 
                    
                    
            int res = LibWrap.TestStructInStruct( ref personAll );
                    
                    MyPerson personRes 
            = 
                        (MyPerson)Marshal.PtrToStructure( personAll.person, typeof( MyPerson ));
                    
                    Marshal.FreeCoTaskMem( buffer );
                    
                    Console.WriteLine( 
            "Person after call:" );
                    Console.WriteLine( 
            "first = {0}, last = {1}, age = {2}"
                        personRes.first, personRes.last, personAll.age );
                    
                    
            // ******************* structure with embedded structure ************    
                    MyPerson3 person3 
            = new MyPerson3();
                    person3.person.first 
            = "Marie";
                    person3.person.last 
            = "Claire";
                    person3.age 
            = 27;
                    
                    LibWrap.TestStructInStruct3( person3 );
                    
                    
            // ******************* structure with embedded array ************    
                    MyArrayStruct myStruct 
            = new MyArrayStruct();
                    
                    myStruct.flag 
            = false;
                    myStruct.vals 
            = new int3 ];
                    myStruct.vals[ 
            0 ] = 1;
                    myStruct.vals[ 
            1 ] = 4;
                    myStruct.vals[ 
            2 ] = 9;
                    
                    Console.WriteLine( 
            "\nStructure with array before call:" );
                    Console.WriteLine( myStruct.flag );
                    Console.WriteLine( 
            "{0} {1} {2}", myStruct.vals[ 0 ], 
                        myStruct.vals[ 
            1 ], myStruct.vals[ 2 ] );
                    
                    LibWrap.TestArrayInStruct( ref myStruct );
                    
                    Console.WriteLine( 
            "\nStructure with array after call:" );
                    Console.WriteLine( myStruct.flag );
                    Console.WriteLine( 
            "{0} {1} {2}", myStruct.vals[ 0 ], 
                        myStruct.vals[ 
            1 ], myStruct.vals[ 2 ] );        
                }
            }

            其他的API,string,數組的調用實例:請下載:PlatformInvoke實例。

            posted on 2007-06-04 23:34 夢在天涯 閱讀(2231) 評論(3)  編輯 收藏 引用 所屬分類: CPlusPlusC#/.NET

            評論

            # re: struct在p/invoke中的轉化 2007-06-04 23:35 夢在天涯

            DLL文件:http://msdn2.microsoft.com/zh-cn/library/as6wyhwt(VS.80).aspx  回復  更多評論   

            # re: struct在p/invoke中的轉化 2007-06-04 23:38 夢在天涯

            C#的調用文件:http://msdn2.microsoft.com/zh-cn/library/hk9wyw21(VS.80).aspx  回復  更多評論   

            # re: struct在p/invoke中的轉化 2007-06-04 23:50 夢在天涯

            更多其他的封裝的實例:可以msdn查找:封送類、結構和聯合

            http://msdn2.microsoft.com/zh-cn/library/eshywdt7(VS.80).aspx  回復  更多評論   

            公告

            EMail:itech001#126.com

            導航

            統計

            • 隨筆 - 461
            • 文章 - 4
            • 評論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1804303
            • 排名 - 5

            最新評論

            閱讀排行榜

            久久99精品九九九久久婷婷| 久久久黄色大片| 热re99久久精品国产99热| 久久伊人精品青青草原高清| 97久久精品人人澡人人爽| 久久九九免费高清视频| 午夜精品久久久久久| 国产精品久久久久jk制服| 久久国产高清一区二区三区| 国产精品99久久久精品无码| 久久精品中文騷妇女内射| 久久精品一区二区三区中文字幕| 久久久亚洲欧洲日产国码是AV| 99久久er这里只有精品18| segui久久国产精品| 久久人人爽人人爽人人片av高请| 国产精品成人精品久久久| 久久精品国产亚洲AV影院| 精品无码人妻久久久久久| 久久婷婷五月综合色奶水99啪| 久久午夜综合久久| 精品久久久久久国产| 亚洲综合日韩久久成人AV| 久久成人精品| 丁香五月综合久久激情| 国产成人无码久久久精品一| 久久国语露脸国产精品电影| 久久免费国产精品| 久久久久婷婷| 久久亚洲欧洲国产综合| 99久久综合狠狠综合久久| 93精91精品国产综合久久香蕉| 国产V综合V亚洲欧美久久| 国产激情久久久久久熟女老人| 久久久久99这里有精品10| 日韩欧美亚洲综合久久影院Ds| 久久国产三级无码一区二区| 青青青青久久精品国产h| 国产精品免费久久久久久久久| 免费精品99久久国产综合精品| 亚洲成人精品久久|