精华内容
下载资源
问答
  • 1、 使用Visual C++ 6.0编写和链接DLL 打开Visual C++ 6.0集成开发环境,新建一个Win32 Dynamic-Link Library类型的工程CDLL,在工程中新建一个C语言源文件cdll.c。源文件中的内容如下: __declspec(dllexport) int ...

    1、 使用Visual C++ 6.0编写和链接DLL

    打开Visual C++ 6.0集成开发环境,新建一个Win32 Dynamic-Link Library类型的工程CDLL,在工程中新建一个C语言源文件cdll.c。源文件中的内容如下:

    __declspec(dllexport) int max(int x,int y) /* 比较两个整型变量大小的函数max */

    {

       if (x>y)

          return x;

        else

          return y;

    }

    输入完毕后按下F7键来编译和链接CDLL.dll,之后可以在存放该工程的文件夹的Debug子文件夹中找到一个名为CDLL的DLL文件,该文件即以上的C语言源程序生成的DLL。

     

    2、 使用Delphi 7编写调用该DLL的应用程序

    打开Delphi 7集成开发环境,在默认生成的窗体Form1上拖放3个Edit控件Edit1、Edit2、Edit3和1个Button控件Button1,并在Object Inspector中将3个Edit控件的Text属性都清空。然后在默认生成的Unit1.pas文件的implementation后输入:

    function max(x,y: Integer): Integer; stdcall external 'CDLL.DLL';

    返回Form1,双击Button1控件,在生成的事件处理程序中输入:

    Edit3.Text:=IntToStr(max(StrToInt(Edit1.Text), StrToInt(Edit2.Text)));

    输入完毕后,保存这个Project。最后,将CDLL.dll文件copy到保存该Project的文件夹中。

     

    3、 测试

    在Delphi集成开发环境下,按下F9来运行刚刚编写的Project。在Edit1中输入2,Edit2中输入4,然后单击Button1,可以看到Edit3中会出现4,测试成功。


    4、基础知识


    4.1、回调函数


    软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。其中回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础。

    回调函数与普通函数的申明并无区别,但如果是不同的开发语言之间通过回调函数来传递与处理数据,则一定要注意在不同语言对回调函数的申明与实现时其函数调用约定必须保持一致。


    4.2、函数调用约定


    声明过程或函数时,可以指定调用约定(calling convention),尤其在以接口形式提供给其它语言工具使用时,则必须指定过程或函数的调用方式。

    Delphi指定调用约定可以使用的指示字包括register、pascal、cdecl、stdcall以及safecall。C/C++调用约定有stdcall、cdecl、fastcall、thiscall、naked call等。

    决定了传递给例程的参数的顺序,还影响参数从栈中的解除、参数传递时对寄存器的使用以及处理错误和异常等。缺省的调用约定是register。


    下表是调用约定的简要概括:

     

    指示字 ...........参数顺序 ................................................参数删除者 寄存器传递参数
    register ...........从左到右 ...............................................例程 .....................是
    pascal ............从左到右 ................................................例程 ....................否
    cdecl ..............从右到左 .................................................调用者 ................否
    stdcall ............从右到左 .................................................例程 ....................否
    safecall ..........从右到左 .................................................例程 ....................否
    fastcall ...........函数前两个参数通过ecx和edx传递,...例程 ................部分是
    ........................其他参数从右向左的顺序压栈
    thiscall ...........从右到左 .................................................例程.
    (非关键词)..... (this指针保存在ecx,仅用于c++)  
    naked call....... 一般用于实模式驱动程序设计 ...........- .............................-


    补充说明:

    ·cdecl调用约定又称为C调用约定,是C语言缺省的调用约定.

    ·register约定最多可以使用三个CPU寄存器传递参数,而其他的约定都通过栈传递所有的参数。

    ·safecall约定实现了异常防火墙。在Windows中,这一实现在内部处理COM错误通知。

    ·缺省的register约定是效率最高的,因为它通常避免了栈中新帧的创建。

    ·调用来自用C或C++编写的共享库的函数时,cdecl约定是很有用的;而对外部代码的调用,一般而言,推荐使用stdcall和safecall约定。

    ·在Windows中,操作系统API函数使用的是stdcall和safecall约定。其他操作系统通常使用cdecl约定。(注意,stdcall约定比cdecl约定具有更高的效率。)

    ·safecall约定必需用于声明双重接口的方法。pascal约定用于维持向后(旧版本)兼容。

     

     

    转载于:https://www.cnblogs.com/zhaoshujie/archive/2009/12/11/9594790.html

    展开全文
  • C语言编写dll并调用

    2016-10-10 15:47:00
    dll.h文件 1 #ifndef _DLL_H_ 2 #define _DLL_H_ 3 4 #if BUILDING_DLL 5 #define DLLIMPORT __declspec(dllexport) 6 #else 7 #define DLLIMPORT __declspec(dllimport) 8 #endif 9 10 D...

    dll.h文件

     1 #ifndef _DLL_H_
     2 #define _DLL_H_
     3 
     4 #if BUILDING_DLL
     5 #define DLLIMPORT __declspec(dllexport)
     6 #else
     7 #define DLLIMPORT __declspec(dllimport)
     8 #endif
     9 
    10 DLLIMPORT int add(int i,int j);
    11 
    12 #endif

    dll.c文件

     1 /* Replace "dll.h" with the name of your header */
     2 #include "dll.h"
     3 #include <windows.h>
     4 
     5 DLLIMPORT int add(int i, int j)
     6 {
     7     return i+j;
     8 }
     9 
    10 BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
    11 {
    12     switch(fdwReason)
    13     {
    14         case DLL_PROCESS_ATTACH:
    15         {
    16             break;
    17         }
    18         case DLL_PROCESS_DETACH:
    19         {
    20             break;
    21         }
    22         case DLL_THREAD_ATTACH:
    23         {
    24             break;
    25         }
    26         case DLL_THREAD_DETACH:
    27         {
    28             break;
    29         }
    30     }
    31     
    32     /* Return TRUE on success, FALSE on failure */
    33     return TRUE;
    34 }

    exe.c文件(调用dll的)

     1 #include <windows.h>
     2 #include <stdio.h>
     3  
     4 typedef int (*Fun)(int,int);     //这里声明一个函数指针,typedef 关键字是必须的,好像要显示调用dll中的函数,都需要这样用函数指针给出声明
     5  
     6 int main()
     7 {
     8     HINSTANCE hDll;
     9     Fun Add;
    10     hDll=LoadLibrary("myDll.dll");
    11     if (hDll==NULL)
    12     {
    13         printf("%s","failed to load dll!\n");
    14     }
    15     else
    16     {
    17         printf("%s","succeeded in loading dll\n");
    18         Add=(Fun)GetProcAddress(hDll,"add");
    19         if (Add!=NULL)
    20         {
    21             int i,j;
    22             printf("%s","input the first number:");
    23             scanf("%d",&i);
    24             printf("%s","input the first number:");
    25             scanf("%d",&j);
    26             printf("sum = %d\n",Add(i,j));
    27         }
    28     }
    29     FreeLibrary(hDll);
    30     
    31     system("pause");
    32     return 0;
    33 }

     

    转载于:https://www.cnblogs.com/cnrsgx/p/5946094.html

    展开全文
  • C语言编写的最大功率跟踪DLL文件,用Bladed外部控制调用
  • C语言编写CAPLdll

    千次阅读 2016-07-28 23:30:15
    CANoe是一个强大的总线仿真工具,通过CAPL语言可以实现较为复杂的ECU内部逻辑,有效仿真总线网络。...这时就需要编写一个CAPL dll文件,调用外部代码。本文介绍通过Visual Studio编译c代码生成CAPL dll。
    
    

    CANoe是一个强大的总线仿真工具,通过CAPL语言可以实现较为复杂的ECU内部逻辑,有效仿真总线网络。但是在使用的时候经常会碰到CAPL库函数不够用的情况,比如需要用到AES加密时,CAPL没有对应函数,而又没有现成的CAPL加密代码。这时就需要编写一个CAPL dll文件,调用外部代码。本文介绍通过Visual Studio编译c代码生成CAPL dll

    首先在CANoe的文档路径下可以找到一个CAPLdll的示例工程,直接在此基础上修改即可,我这里是存在C盘下:

    C:\Users\Public\Documents\Vector\CANoe\8.5(x64)\CANoe Sample Configurations\Programming\CAPLdll\VS 2005 Project。打开sln文件,由于示例是2005版本,如果使用高版本需要进行单向升级,我使用2013版,升级后可以使用。

            如图所示,这个capldll.cpp就是需要修改的文件,这是一个c++工程,如果需要使用.c文件,只需在#include前后加上externa “C”{}即可正常编译。

        接下来就是加入自己的代码文件。为了制作AES加密库函数,我使用了embedTLS中的AES加密文件,加入工程即可。




    找到下面这个table,这里定义了所有要导出的函数。由于是示例工程,原来就有不少定义的函数,大多都是简单的加法,导入导出数据等,看懂后可以删掉其中示例部分,添加自己的导出函数。编写规则大致如下:


        其中Llong Vvoid B为数组,Dint,输入变量有几个就写几个字母。如果有数组,则倒数第二个参数不能为空,要写"\001"(只有一个数组作为输入变量),如果除了数组外,还有一个长度参数,则要写"\000\001",以表示第一个不是数组,如果有三个变量则要写三个,以此类推。

        接下来就是在工程中完成要输出的函数主体。比方我刚刚在输出列表里添加了一个叫做Loadkey的函数,它有一个字节数组作为输入量,一个long作为返回值。添加函数如下:

    longCAPLEXPORTfarCAPLPASCAL LoadEncKey(unsignedchardataBlock[])

    {

       int i;

       for (i = 0; i < 16; i++)

       {

           enckey[i]=dataBlock[i];

       }

       mbedtls_aes_setkey_enc(&aes,enckey, 128);// set encrypt key

     

       FILE *fp = fopen("d:\\info.txt","a");

       fprintf(fp,"The Encrypt key is: ");

       for (i = 0; i < 16; i++)

           fprintf(fp,"0x%x ", enckey[i]);

       fprintf(fp,"\n");

       fclose(fp);

       return (0);

    }



    当添加完所有要输出的函数后,即可编译。编译生成的新dlldebug文件夹下,叫做capldll.dll。将其复制到CANoe安装目录下Exec32文件夹下。在CAPL编辑界面下添加include


    includes


    {


     #pragma library("D:\CANoe8.5\Exec32\capldll.dll")


    }


    保存后即可发现右边函数栏多了一个CAPLdll文件,里面有刚才编译好的函数。尽情享用吧J~




    
    展开全文
  • 上述为C语言编写的库,需要这样添加头文件。其他就正常添加头文件即可。 4. 将编译文件删除,重新构建。 5. 将.dll文件添加到.exe所在的文件夹中。 注意:1. 无法解析的 解决方法:将编译文...

    1. 导入外部库

    .pro文件中添加的代码

     

    2. 将.h文件添加到项目路径下,并通过“添加现有文件”将其添加到解决方案中

    3. 在需要用到的地方添加头文件

    上述为C语言编写的库,需要这样添加头文件。其他就正常添加头文件即可。

    4. 将编译文件删除,重新构建。

    5. 将.dll文件添加到.exe所在的文件夹中。

     

     

    注意:1. 无法解析的

    解决方法:将编译文件删除,重新构建,然后将Dll文件加入到.exe文件所在的编译路径下。

    展开全文
  • C lang: 封装C语言编写DLL(Dynamic Link Library) 在 IntelliJ IDEA 中调用DLL的方法在这里. 1. 打开Visual Studio 2019 →\rightarrow→ 创建新项目 →\rightarrow→ Windows Desktop Wizad 2. 选择Dynamic Link...
  • PAGE / NUMPAGES 开发环境是DEV C++,采用C语言编写 创建一个DLL项目项目名称hello,DLL编写采用的是DEV C++中的示例代码 头文件dll.h #ifndef _DLL_H_ #define _DLL_H_ #if BUILDING_DLL # define DLLIMPORT _...
  • 文件中的方法前缀也是有包名和方法名组成的。在后面的调用过程中要保证 class 文件所在的包没有改变,如果改变 class 文件的位置,就需要重新生成 h 头文件和动态库文件。 2.2 、生成 so 文件 gcc Sample2.c ...
  • PAGE / NUMPAGES 在VS2008中编写C语言DLL并在C++和C#项目下调用 文件--打开--新建项目--Win32右侧Win32项目填写好项目名称点击下一步应用程序类型选择DLL(D)附加选项空项目(E)然后完成 编写头文件(edrlib.h) #ifdef ...
  • 编写C语言和C++同时都能调用的皮肤加载dll文件,然后通过测试程序动态调用dll文件,实现窗口程序的皮肤加载,实现了界面美化的功能。
  • 一、用vc编写dll文件 首先建立一个Win32 Dynamic-Link Library工程,在工程中添加要写的代码。 注意:与普通工程不同的是在dll工程中声明函数或者类时要在前面写上_declspec(dllexport),如: class _declspec...
  • 利用C语言编写放烟花的程序(同时也可以播放音乐),注意,不要删除3个dll文件,否则程序可能出错,遇到.dll文件缺失时,安装微软运行库合集就可以解决。
  • 今天用VC6.0编写多线程程序时,编译能通过,执行的时候一直报错: 由于找不到pthreadVC2.dll,无法继续执行代码,重新安装程序可能会解决此问题,在网上找了...然后放了还是报错,最后把这个dll文件又放了一份到Sys...
  • dll文件一般是在windows平台使用,由c/c++编译后的二进制代码,使用反向编译可能能得到原代码,通过viewdll....下面简单的总结c#和java怎么使用c语言编写的dll文件,一般c语言编写dll文件时为了多平台的使用。 c
  • 1、编写DLL a)文件--打开--新建项目--Win32,右侧Win32项目,填写好项目名称,点击“下一步”, 应用程序类型选择:“DLL(D)”,附加选项:空项目(E),然后完成。 b)编写头文件(edrlib.h): #ifdef__...
  • c语言编写全局键盘钩子

    千次阅读 2012-05-13 16:48:37
    KeyHook.c:用于生成DLL文件 #include #include static HHOOK hkb=NULL; static HINSTANCE hins; LRESULT RetVal; // 使用__declspec(dllexport)声明导出函数 __declspec(dllexport) LRESULT CALLBACK ...
  • 一、编写DLL  a)文件--打开--新建项目--Win32,右侧Win32项目,填写好项目名称,点击“下一步”,  应用程序类型选择:“DLL(D)”,附加选项:空项目(E),然后完成。  b)编写头文件(edrlib.h): ...
  • NSIS可以和C/C++混合编程,...// Demo.h文件 #ifdef DEMO_EXPORTS #define DEMO_API extern "C" __declspec(dllexport) #else #define DEMO_API extern "C" __declspec(dllimport) #endif D...
  • 使用C语言编写代码并生成动态链接库 使用MATLAB调用动态链接库 以一个简单的例子演示并说明整个过程 我使用的环境为: MATLAB R2015a 64bit Visual Studio 2013 64bit 编写你自己的程序并生成动态链接库(.dll) 在...
  • 首先--添加dll,修改php.ini--不同的版本,不同的需求 其次,根据教程http://www.laruence.com/manual/tutorial.firstpage.html#tutorial.directory手动搭建好目录结构 入口文件index.php...
  • C调用dll的事例

    2019-01-14 12:39:33
    C语言编写dll文件的事例,里面详细介绍了如何使用与如何编写一个dll
  • 本版病毒所具有的功能:1....生成病毒体:c:\windows\wjview32.comc:\windows\explorer.exec:\windows\system32\dllcache\explorer.exec:\windows\system\msmouse.dllc:\windows\system32\cmdsys....
  • java通过JNA调用c语言dll

    千次阅读 2016-04-21 09:46:40
    以调用c语言为例,可以将c的函数导出dll,java通过JNI/JNA来调用。本文涉及范围 window平台 Java调用c/c++ JNI vs JNA JNI JNA c和Java互调 只能Java调c 编写复杂,需要先根据Java生成对应c的函数声明,然后用c...
  • C#调用C的动态链接库 C和C#作为日常工作中很常见的两种开发语言,难免会遇到彼此需要调用的情况。本章重点讲一下关于C#调用C的dll的经验,希望能...第二步:创建C的SOURCE文件,并编写API函数 void C_API(uint8_tPtr,
  • 1.delphi调用C语言动态连接库 2.动态调用Dll 3.MAKE_DLL目录演示如何编写DLL文件
  • 通过C语言编写一个DLL文件和一个EXE文件,其中DLL包含作弊功能,运行EXE后将DLL注入游戏,使得游戏仅靠自身进程便可以实现作弊功能。 对象分析 要用的API函数简单介绍 编写测试效果 总体评价 对象分析 注:本次游戏...
  • 3、在pch.c文件编写函数实现的功能,这里我实现一个加法功能的函数 4、将函数的声明在pch.h文件中实现 ==(注意要加上红框中的代码),这部分代码C语言和C++是不同的 == 5、点击“生成”->生成解决方案即可 6...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 276
精华内容 110
关键字:

c语言编写dll文件

c语言 订阅