在VS2008环境下编写C语言DLL,并在C++和C#项目下调用
2014-11-17 08:50
701 查看
一、编写DLL
a)文件--打开--新建项目--Win32,右侧Win32项目,填写好项目名称,点击“下一步”,
应用程序类型选择:“DLL(D)”,附加选项:空项目(E),然后完成。
b)编写头文件(edrlib.h):
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#ifdef __cplusplus
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#define EXPORT extern "C" __declspec (dllexport)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#else
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#define EXPORT __declspec (dllexport)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#endif
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
EXPORT void EdrCenterTextA();
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
EXPORT void EdrCenterTextW();
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
EXPORT int IncCounter();
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#ifdef UNICODE
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#define EdrCenterText EdrCenterTextW
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#else
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#define EdrCenterText EdrCenterTextA
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#endif
注解:
i. 定义 __cplusplus表示是供C++程序中调用。
ii.__declspec (dllexport)表示函数调用方式,此处表示VS2008工程属性调用的默认方式。更改方法:
右击项目--属性--配置属性--C/C++--高级,更改右侧“调用约定”。
c)编写DLL文件(edrlib.cpp):
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include "windows.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include "edrlib.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//counter供调用该DLL的所有应用程序共享
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#pragma data_seg("shared")
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int counter=0;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#pragma comment(linker,"/SECTION:shared,RWS")
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int WINAPI DllMain(_In_ HANDLE _HDllHandle, _In_ DWORD _Reason, _In_opt_ LPVOID _Reserved)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return TRUE;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
EXPORT void EdrCenterTextA()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
MessageBox(NULL,TEXT("调用DLL函数!"),TEXT("ASSIC版本"),MB_OK);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
EXPORT void EdrCenterTextW()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
MessageBox(NULL,TEXT("调用DLL函数!"),TEXT("UNICODE版本"),MB_OK);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
EXPORT int IncCounter()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return ++counter;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
c)编译生成DLL。
二、调用DLL
方法一、
1。新建Win32应用程序空项目。
2。把生成的dll、lib这2个文件复制到新建的目录下。
3。添加导入库:工具--项目和解决方案--VC++目录,选择右侧“显示以下内容的目录”下的“库文件”,把lib所在目录添加。
4。头文件:edrlib.h(与编写DLL中一样)
5。源文件:main.c
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/*#define cplusplus*/ //c++调用方式
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include "windows.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include "edrlib.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#pragma comment(lib,"edrlib.lib")
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int WINAPI WinMain(__in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
TCHAR buf[32];
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
wsprintf(buf,L"now,counter=%i",IncCounter());
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
MessageBox(NULL,buf,L"--",MB_OK);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
EdrCenterText();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return 0;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
解释:
可注释#pragma comment(lib,"TestDLL2.lib")这条,但必须设置链接库,方法:
右击项目--属性--配置属性--链接器--输入--附加依赖项:edrlib.lib
6.运行测试成功。
【以上内容转自:http://blog.csdn.net/breezes2008/archive/2010/02/25/5326861.aspx】
3、在C#中调用DLL
此示例使用 C 程序创建一个 DLL,在下一示例中将从 C# 程序调用该 DLL。
// cmdll.c// Compile with: /LDint __declspec(dllexport) SampleMethod(int i){ return i*10;}
如果是Web项目,把DLL复制到bin目录下。
如果是桌面程序,把DLL复制到可执行行文件目录下。
引用代码:
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
using System;using System.Runtime.InteropServices;public class MainClass { [DllImport("Cmdll.dll")] public static extern int SampleMethod(int x); static void Main() { Console.WriteLine("SampleMethod() returns {0}.", SampleMethod(5)); }}
from:http://apps.hi.baidu.com/share/detail/33471191
a)文件--打开--新建项目--Win32,右侧Win32项目,填写好项目名称,点击“下一步”,
应用程序类型选择:“DLL(D)”,附加选项:空项目(E),然后完成。
b)编写头文件(edrlib.h):
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#ifdef __cplusplus
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#define EXPORT extern "C" __declspec (dllexport)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#else
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#define EXPORT __declspec (dllexport)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#endif
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
EXPORT void EdrCenterTextA();
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
EXPORT void EdrCenterTextW();
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
EXPORT int IncCounter();
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#ifdef UNICODE
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#define EdrCenterText EdrCenterTextW
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#else
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#define EdrCenterText EdrCenterTextA
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#endif
注解:
i. 定义 __cplusplus表示是供C++程序中调用。
ii.__declspec (dllexport)表示函数调用方式,此处表示VS2008工程属性调用的默认方式。更改方法:
右击项目--属性--配置属性--C/C++--高级,更改右侧“调用约定”。
c)编写DLL文件(edrlib.cpp):
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include "windows.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include "edrlib.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
//counter供调用该DLL的所有应用程序共享
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#pragma data_seg("shared")
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int counter=0;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#pragma comment(linker,"/SECTION:shared,RWS")
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int WINAPI DllMain(_In_ HANDLE _HDllHandle, _In_ DWORD _Reason, _In_opt_ LPVOID _Reserved)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return TRUE;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
EXPORT void EdrCenterTextA()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
MessageBox(NULL,TEXT("调用DLL函数!"),TEXT("ASSIC版本"),MB_OK);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
EXPORT void EdrCenterTextW()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
MessageBox(NULL,TEXT("调用DLL函数!"),TEXT("UNICODE版本"),MB_OK);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
EXPORT int IncCounter()
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return ++counter;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
c)编译生成DLL。
二、调用DLL
方法一、
1。新建Win32应用程序空项目。
2。把生成的dll、lib这2个文件复制到新建的目录下。
3。添加导入库:工具--项目和解决方案--VC++目录,选择右侧“显示以下内容的目录”下的“库文件”,把lib所在目录添加。
4。头文件:edrlib.h(与编写DLL中一样)
5。源文件:main.c
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/*#define cplusplus*/ //c++调用方式
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include "windows.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#include "edrlib.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
#pragma comment(lib,"edrlib.lib")
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int WINAPI WinMain(__in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
TCHAR buf[32];
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
wsprintf(buf,L"now,counter=%i",IncCounter());
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
MessageBox(NULL,buf,L"--",MB_OK);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
EdrCenterText();
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return 0;
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
解释:
可注释#pragma comment(lib,"TestDLL2.lib")这条,但必须设置链接库,方法:
右击项目--属性--配置属性--链接器--输入--附加依赖项:edrlib.lib
6.运行测试成功。
【以上内容转自:http://blog.csdn.net/breezes2008/archive/2010/02/25/5326861.aspx】
3、在C#中调用DLL
此示例使用 C 程序创建一个 DLL,在下一示例中将从 C# 程序调用该 DLL。
// cmdll.c// Compile with: /LDint __declspec(dllexport) SampleMethod(int i){ return i*10;}
如果是Web项目,把DLL复制到bin目录下。
如果是桌面程序,把DLL复制到可执行行文件目录下。
引用代码:
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
using System;using System.Runtime.InteropServices;public class MainClass { [DllImport("Cmdll.dll")] public static extern int SampleMethod(int x); static void Main() { Console.WriteLine("SampleMethod() returns {0}.", SampleMethod(5)); }}
from:http://apps.hi.baidu.com/share/detail/33471191
相关文章推荐
- 在VS2008环境下编写C语言DLL,并在C++和C#项目下调用 (转载)
- 综合项目之闪讯破解(五)之 如何用C#调用C++编写的Dll
- 综合项目之闪讯破解(四)之 如何用C++编写可被C#调用的Dll
- 在c#项目中调用及调试c++写的dll
- C#如何调用C++编写的dll中的导出类
- c#.net下成功调用c++编写的标准dll
- C#调用C++编写的COM DLL
- com调用的几种方法 及 C#调用C++编写的的COM DLL收藏
- 用VS2008生成C++代码的dll及在C#中的调用及常见的类型转换
- com调用的几种方法 及 C#调用C++编写的的COM DLL
- c#程序调用c++编写dll需要注意问题
- C#调用C++程序编写的dll
- 如何在C语言中调用C++编写的DLL中的函数
- C#调用C++编写的COM DLL
- 编写C#调用的C++DLL
- 在C#中如何调用C++编写的DLL
- c#调用c++编写的DLL
- C++与C#编写的DLL/COM的各种调用方法
- [总结]非托管C++代码调用C#编写的dll方法
- C# 中调用 C++编写的 dll 的 调试