您的位置:首页 > 编程语言 > C语言/C++

在VS2008环境下编写C语言DLL,并在C++和C#项目下调用

2014-11-17 08:50 701 查看
一、编写DLL

a)文件--打开--新建项目--Win32,右侧Win32项目,填写好项目名称,点击“下一步”,

应用程序类型选择:“DLL(D)”,附加选项:空项目(E),然后完成。

b)编写头文件(edrlib.h):


#ifdef __cplusplus


#define EXPORT extern "C" __declspec (dllexport)


#else


#define EXPORT __declspec (dllexport)


#endif




EXPORT void EdrCenterTextA();


EXPORT void EdrCenterTextW();


EXPORT int IncCounter();


#ifdef UNICODE


#define EdrCenterText EdrCenterTextW


#else


#define EdrCenterText EdrCenterTextA


#endif
注解:

i. 定义 __cplusplus表示是供C++程序中调用。

ii.__declspec (dllexport)表示函数调用方式,此处表示VS2008工程属性调用的默认方式。更改方法:

右击项目--属性--配置属性--C/C++--高级,更改右侧“调用约定”。

c)编写DLL文件(edrlib.cpp):


#include "windows.h"


#include "edrlib.h"


//counter供调用该DLL的所有应用程序共享


#pragma data_seg("shared")


int counter=0;


#pragma comment(linker,"/SECTION:shared,RWS")




int WINAPI DllMain(_In_ HANDLE _HDllHandle, _In_ DWORD _Reason, _In_opt_ LPVOID _Reserved)


{


return TRUE;


}




EXPORT void EdrCenterTextA()


{


MessageBox(NULL,TEXT("调用DLL函数!"),TEXT("ASSIC版本"),MB_OK);




}


EXPORT void EdrCenterTextW()


{


MessageBox(NULL,TEXT("调用DLL函数!"),TEXT("UNICODE版本"),MB_OK);




}




EXPORT int IncCounter()


{


return ++counter;


}
c)编译生成DLL。

二、调用DLL

方法一、

1。新建Win32应用程序空项目。

2。把生成的dll、lib这2个文件复制到新建的目录下。

3。添加导入库:工具--项目和解决方案--VC++目录,选择右侧“显示以下内容的目录”下的“库文件”,把lib所在目录添加。

4。头文件:edrlib.h(与编写DLL中一样)

5。源文件:main.c


/*#define cplusplus*/ //c++调用方式


#include "windows.h"


#include "edrlib.h"


#pragma comment(lib,"edrlib.lib")




int WINAPI WinMain(__in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )


{




TCHAR buf[32];


wsprintf(buf,L"now,counter=%i",IncCounter());


MessageBox(NULL,buf,L"--",MB_OK);


EdrCenterText();


return 0;


}



解释:

可注释#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复制到可执行行文件目录下。

引用代码:


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: