C#调用CC++ dll

    技术2024-04-19  16

    本文通过实例代码说明如何在托管的C#代码中调用非托管的Win32 API或者自己用C/C++写的Dll中的函数,以及如何传递输入、输出字符串参数,结构类型参数等问题。   Win32 C/C++ DLL代码如下(最终编译成dll.dll): #include "stdafx.h" #include <stdio.h>   #ifdef _MANAGED #pragma managed(push, off) #endif //简单的函数调用测试 extern "C" __declspec(dllexport) int Test(void) { return 34; } //输入输出字符串传递测试 extern "C" __declspec(dllexport) int TCharPara(char *in, int len, char *out) {      memcpy(out, in, len);   return 0; } //结构参数传递测试 struct _XY {      int x;      int y; }; extern "C" __declspec(dllexport) int TStructPara(struct _XY *xy) {      xy->x = 5;      xy->y = 5;   return 0; } //回调函数测试 typedef void (CALLBACK *CBFunc)(char *); extern "C" __declspec(dllexport) int TCallback(CBFunc pf, char *out) {      (*pf)(out);   return 0; } #ifdef _MANAGED #pragma managed(pop) #endif   调用Win32 C/C++ dll中函数的托管C#代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices;   namespace TCallCDll {      //用于测试结构参数传递,对应Win32 dll中的结构_XY     [StructLayout(LayoutKind.Sequential)]     public struct _XY     {         public int x;         public int y;     };      //Win32 C/C++ dll中的函数TCallback回调此函数 public delegate void OurDllCallBack(String iin); //user32.dll中的EnumWindows函数回调此函数     public delegate bool SysCallBack(int hwnd, int lParam);       public class TCallCDll{         [DllImport("dll.dll")]         //         //iin: 输入参数         //oout: 输出参数         //         public static extern int TCharPara(String iin, int len, StringBuilder oout);         //测试结构参数传递的函数         [DllImport("dll.dll")]         public static extern int TStructPara(ref _XY xy);          //自己的dll函数回调测试         [DllImport("dll.dll", CharSet = CharSet.Ansi)]         public static extern void TCallback(OurDllCallBack f, String s);          //user32.dll中的函数回调测试         [DllImport("user32.dll")]         public static extern int EnumWindows(SysCallBack x, int y);       }     public partial class callCDllMain : Form     {         public callCDllMain()         {             InitializeComponent();         }         //提供给dll.dll中的TCallback回调的函数         public static void ff(String s)         {             Console.WriteLine(s);         }         //提供给user32.dll中的EnumWindows回调的函数         public static bool Report(int hwnd, int lParam)         {             Console.Write("Window handle is ");             Console.WriteLine(hwnd);             return true;         }           private void Form1_Load(object sender, EventArgs e)         {             StringBuilder a = new StringBuilder(3);             TCallCDll.TCharPara("ABC", 3, a);             this.Text = a.ToString();               _XY xy = new _XY();             TCallCDll.TStructPara(ref xy);             this.Text += "x:" + xy.x + ", y:" + xy.y;               OurDllCallBack fff = new OurDllCallBack(ff);             TCallCDll.TCallback(fff, "This string is output in C&C++ dll call back function set in C# code/n");               SysCallBack cb = new SysCallBack(Report);             TCallCDll.EnumWindows(cb, 0);         }     } } 本文来自博客,转载请标明出处:http://blog.csdn.net/ZOLoveGD/archive/2009/04/03/4046845.aspx

    最新回复(0)