< classid="clsid:38481807-CA0E-42D2-BF39-B33AF135CC4D" id=ieooui> <!--[endif]-->
实例代码见:http://download.csdn.net/source/1172831
本文通过实例代码说明如何在托管的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);
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ZOLoveGD/archive/2009/04/03/4046845.aspx
分享到:
相关推荐
C#可以通过P/Invoke调用C/C++写的DLL,一般在从DLL接收字符串时比较麻烦,本人在某个项目中遇到这个问题, 从DLL收读取字符串时遇到中文乱码,这里总结一下C#收取字符串时的处理。 C/C++字符串一般通过char* ...
在C#开发软件的过程中,要经常调用C/C++生成的dll,本文主要介绍用C/C++生成dll的步骤,以及用C/C++、C#两种语言实现dll的引用实现。本文使用的IDE是VS2019,文章通过具体实例进行讲解,大家可以跟着自己动手进行...
实例代码说明如何在托管的C#代码中调用非托管的Win32 API或者自己用C/C++写的Dll中的函数,以及如何传递输入、输出字符串参数,结构类型参数等问题。
c++动态库调用另一个动态库 c++动态库调用c动态库 c#等其他语言调用c/c++动态库
本例子适用范围:程序初学者。 使用环境win7 + vs2010...(QT 工程中提供了 QTC++调用QTC++DLL例子) CSharp_Call_Cplusplus_Dll 例子: 针对2说明,目前只实现了网络连接,数据发送暂不行 能力有限,不喜勿碰,仅供参考
C#使用CLR调用C++的DLL库的windows完整解决方案 说明如下: 1、工程一:C++的DLL 2、工程二:C++的CLR的类库 3、工程三:C#的exe
c#调用c++DLL,DLL里是二维数组 ,c#里如何调用二维数组
c++编译OpenCV生成dll winform调用dll打开本地或网络摄像头 支持海康、大华等网络摄像头
1.C#调用C++封装的动态库dll 2.结构体含union共同体的C++转C#示例 3.C#结构体指针的调用演示 4.C#读取USB数据设备的示例 5.C#动态调用C++dll库示例 6.C#静态调用C++dll库示例 注意:UsbLibDotNet使用时候需要先安装...
C#调用C++DLL的参数传入,传出,string类型的传出等 1.数据类型转换问题 2.指针或者地址传送问题
C#调用C++DLL,C++DLL中的函数参数包含指针。 绝对可用。
C#动态调用DLL文件(有的DLL是用C++或其它语言写的不能直接调用,但可以用态调用)
C#_VS2005调用C++DLL
c# 调用C++编写 的DLL函数各种参数传递问题。数据处理问题等等。
C++DLL中包含一个类,C#端要调用这个类的函数,重新封装这个类,来供C#端调用
资源代码演示的是c#代码调用c++ DLL 的方式。该演示为原创,绝非搬砖。解决了c# 调用 C++ Dll获取相关信息之如何传递结构体数组引用以及如何处理获取到的结构体数组数据的问题。
c#调用c++ dll 传参 string 崩溃的一种解决办法
通过C#可以调用C语言封装的DLL库,通过测试是可以的。
当C#调用C++dll时,需要传递自定义结构的数组,该怎么办? 示例给出了方案
演示c# 通过设置DLL文件 生成操作 为 嵌入的资源 后,DLL文件嵌入生成的EXE里,然后动态调用DLL,妈妈再也不用担心我找不到DLL文件了