zoukankan      html  css  js  c++  java
  • 在VS2008环境下编写C语言DLL,并在C++和C#项目下调用 (转载)

    1、编写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。

    2、调用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

  • 相关阅读:
    互联网协议入门
    【HTTP】图解HTTPS
    《计算机本科生理想的学习计划》
    VC++ TinyXML
    TinyXML 在vs2010 VC++使用
    Hadoop2.4.1入门实例:MaxTemperature
    xcode6
    Android利用广播监听设备网络连接(断网)的变化情况
    编程算法
    Google的Guava之IO升华
  • 原文地址:https://www.cnblogs.com/lezhou2014/p/4102836.html
Copyright © 2011-2022 走看看