博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

2012年2月22日

摘要: 新建项目->VisualC++->win32->Win32项目->输入项目名称->next->应用程序类型选dll,附加选项选上“导出符号”,添加公共头文件视情况可以加上MFC->完成。 此时生成的项目有示例代码,可以在原来的代码上修改。 需要注意的是: #define 项目名_APIextern "C" _declspec(dllimport) 原来的宏定义可能不包括extern "C",加上可以被C#等语言调用。 在C#中调用的时候,把dll放到目录中, using System.Runtime.Intero 阅读全文

posted @ 2012-02-22 15:00 未页 阅读(1278) 评论(0) 推荐(0) 编辑

摘要: C#程序实现动态调用DLL的研究摘要:在《csdn开发高手》2004年第03期中的《化功大法——将DLL嵌入EXE》一文,介绍了如何把一个动态链接库作为一个资源嵌入到可执行文件,在可执行文件运行时,自动从资源中释放出来,通过静态加载延迟实现DLL函数的动态加载,程序退出后实现临时文件的自动删除,从而为解决“DLL Hell”提供了一种解决方案。这是一个很好的设计思想,而且该作者也用C++实现了,在Internet上也有相似的VB程序,但在某一技术论坛上提起这种设计方法时,有网友提出:“这种方法好是好,但就是启动速度太慢”。这是因为程序启动时实现DLL释放,然后再加载释放出来的DLL,这个过程会 阅读全文

posted @ 2012-02-22 14:59 未页 阅读(1037) 评论(0) 推荐(1) 编辑

摘要: 被C#调用的DLL一般只需要把导出的函数以适当的形式呈现即可调用,比如extern "C" __declspec(dllexport)BOOLIntegrate3 (){...},这样的函数,在C#里面声明如:[DllImport("xxx.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode)] public static extern bool Integrate3();,这里的调用相对是简单的,而有些数据类型则必须通过MarshalAs来做托管类 阅读全文

posted @ 2012-02-22 14:58 未页 阅读(1151) 评论(0) 推荐(0) 编辑

摘要: 本来是想实现控制台程序运行时自动全屏,但是只找到VC下的实现方法(http://www.vckbase.com/bbs/prime/viewprime.asp?id=347)。其中要使用两个未公开的Win32 API函数来存取控制台窗口,这就需要使用动态调用的方法,动态调用中使用的Windows API函数主要有三个,即:Loadlibrary,GetProcAddress和Freelibrary。步骤如下:1.Loadlibrary:装载指定DLL动态库2.GetProcAddress:获得函数的入口地址3.Freelibrary:从内存中卸载动态库但是C#中是没有函数指针,无法直接使用Ge 阅读全文

posted @ 2012-02-22 14:25 未页 阅读(530) 评论(0) 推荐(0) 编辑

摘要: 原来的工程是用C++语言编写的。如果需要在C#工程中调用c++完成的功能模块,一个简单的做法就是将原有C++模块封装为动态链接库(DLL), 而在c#中直接导入已有的DLL 接口。具体的做法如下:(1) 将原来C++模块封装为DLLa.创建和使用动态链接库(2) 在C#工程中声明导入的DLL中函数接口一个简单的实例如下:假设已有C++ 函数publicstaticexterninttutorial (int*z,int*x,int* y ); // C++函数声明为了在C# 中调用tutorial函数,需要在相应的CS文件中导入相关的函数声明:using System.Runtime.Inte 阅读全文

posted @ 2012-02-22 14:15 未页 阅读(420) 评论(0) 推荐(0) 编辑

摘要: 引用:http://www.cnblogs.comhttp://archive.cnblogs.com/moonz-wu/archive/2008/02/29/1086759.html这篇文章没有什么新意,在2004年的时候就有人写过那时候VS还只是2003版,而且网络上也有很多转来转去的文章,其实一共那么两三篇。其实我也是从那里学来的,只不过中间经历的一些郁闷,因为那些文章没有提到一些注意的事项确是很烦人。1. 建立一个C#控制台工程,主要用于调试。2. 在解决方案中添加一个新的空工程(VC++的)。3. 添加一个源文件到Source Files文件夹(xxx.c or xxx.cpp)。4 阅读全文

posted @ 2012-02-22 10:46 未页 阅读(475) 评论(0) 推荐(0) 编辑

摘要: usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Runtime.InteropServices;//注入dll需要引用的命名空间 namespaceTG300 { publicclassTG300API { //打开读写器 [DllImport("RM300API.dll",EntryPoint="OpenReader")]//在这里注入dll和对应的C++的方法 publicstaticexternIntPtrOpenReader([MarshalA 阅读全文

posted @ 2012-02-22 10:26 未页 阅读(287) 评论(0) 推荐(0) 编辑

摘要: 这几天公司需要做一个通过刷卡来控制用户上网的功能。我先扩展了windows DDK的passthru源码包,生成了一个NDIS中间层驱动文件。接下来就要写程序控制这个驱动,以达到上网控制的目的。控制程序是用C++代码完成的,先编译成动态链接库(dll)文件。编译的过程就不再废话了,网上很多。这里提示一点就是开始建立MFC dll工程的时候,应该选择“动态链接库和MFC静态链接”这一项,这样编译出来的dll文件是不需要引入库文件(.lib)的。生成好后,得到dll文件(如ForbidNetDll.dll),写一个简单的C#类,例如前面的dll文件导出函数为int forbidNet(int fl 阅读全文

posted @ 2012-02-22 10:24 未页 阅读(356) 评论(0) 推荐(0) 编辑

摘要: 在最近要做的一个项目中,其核心算法是用C++写的,而界面部分准备用C#实现是较好的选择,这就需要在C#的框架中调用C++部分。在C#中调用C++组建大致有两种方法,一种是将它封装成COM,另一种是封装成动态链接库(DLL)。文章《如何在C#中加载自己编写的动态链接库(DLL)》对这两者做了大致比较,详细讲解了后一种方法,在MSDN的中文版中也有对这个问题更专门的讲解:在 C# 中通过 P/Invoke 调用Win32 DLL。C++和C#中所用的数据类型不同,机制也有所区别,在传递参数时需要特别注意。在C#和C++中还可以通过COM组建的方式来共享数据。比如我要做的这个项目中,C#和C++部分 阅读全文

posted @ 2012-02-22 10:14 未页 阅读(615) 评论(0) 推荐(1) 编辑

摘要: 为了能用上原来的C++代码,只好研究下从C# 中调用DLL首先必须要有一个声明,使用的是DllImport关键字:包含DllImport所在的名字空间using System.Runtime.InteropServices;public class XXXX{[DllImport(“MyDLL.dll")]public static extern int mySum (int a,int b);}[DllImport(“MyDLL.dll")]public static extern int mySum (int a,int b);代码中DllImport关键字作用是告诉编 阅读全文

posted @ 2012-02-22 09:12 未页 阅读(517) 评论(0) 推荐(1) 编辑