武松打虎100字:在VS2008环境下编写C语言DLL,并在C++和C#项目下调用

来源:百度文库 编辑:中财网 时间:2024/04/28 05:31:44
在VS2008环境下编写C语言DLL,并在C++和C#项目下调用

1。编写DLL

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

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

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

  1. #ifdef __cplusplus  
  2. #define EXPORT extern "C" __declspec (dllexport)  
  3. #else  
  4. #define EXPORT __declspec (dllexport)  
  5. #endif  
  6.   
  7. EXPORT void  EdrCenterTextA();  
  8. EXPORT void  EdrCenterTextW();  
  9. EXPORT int  IncCounter();  
  10. #ifdef UNICODE  
  11. #define EdrCenterText EdrCenterTextW  
  12. #else  
  13. #define EdrCenterText EdrCenterTextA  
  14. #endif 

注解:

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

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

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

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

  1. #include "windows.h"  
  2. #include "edrlib.h"  
  3. //counter供调用该DLL的所有应用程序共享  
  4. #pragma data_seg("shared")  
  5. int counter=0;  
  6. #pragma comment(linker,"/SECTION:shared,RWS")  
  7.   
  8. int WINAPI DllMain(_In_ HANDLE _HDllHandle, _In_ DWORD _Reason, _In_opt_ LPVOID _Reserved)  
  9. {  
  10.     return TRUE;  
  11. }  
  12.   
  13. EXPORT void   EdrCenterTextA()  
  14. {  
  15.     MessageBox(NULL,TEXT("调用DLL函数!"),TEXT("ASSIC版本"),MB_OK);  
  16.       
  17. }  
  18. EXPORT void  EdrCenterTextW()  
  19. {  
  20.     MessageBox(NULL,TEXT("调用DLL函数!"),TEXT("UNICODE版本"),MB_OK);  
  21.   
  22. }  
  23.   
  24. EXPORT int  IncCounter()  
  25. {  
  26.     return ++counter;  

  c)编译生成DLL。

2。调用DLL

   方法一、

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

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

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

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

   5。源文件:main.c

  1. /*#define cplusplus*/ //c++调用方式  
  2. #include "windows.h"  
  3. #include "edrlib.h"  
  4. #pragma comment(lib,"edrlib.lib")  
  5.   
  6. int WINAPI WinMain(__in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )  
  7. {  
  8.   
  9.     TCHAR buf[32];  
  10.     wsprintf(buf,L"now,counter=%i",IncCounter());  
  11.     MessageBox(NULL,buf,L"--",MB_OK);  
  12.     EdrCenterText();  
  13.     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: /LD
int __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));
}
}
为了您的安全,请只打开来源可靠的网址

打开网站    取消

来自: http://hi.baidu.com/zfc1176/blog/item/2de5c5aa6e1932e91e17a29e.html