精华内容
下载资源
问答
  • 编译带有 __stdcall 调用约定的C++ dLL时,默认会在导出符号后面带上 @ 符号, 1. 如果Windows环境下使用Qt(mingw)开发,可在 .pro 文件中新增如下编译选项 windows{ QMAKE_LFLAGS += -Wl,--kill-at } 2...

    在编译带有 __stdcall 调用约定的C++ dLL时,默认会在导出符号后面带上 @ 符号,

     

    1.   如果Windows环境下使用Qtmingw)开发,可在 .pro 文件中新增如下编译选项

    windows{

              QMAKE_LFLAGS += -Wl,--kill-at

    }

    2.   如果使用VS开发,需要在工程的.def文件,增加导出函数说明

    EXPORTS

              ;Explicit exports can go here

              Func

    展开全文
  • python使用ctypes调用C编译dll函数方法

    千次阅读 2019-02-24 23:01:58
    文章目录1 生成被调用的C dll1.1 C文件编译为C动态链接库1.2 用于外部引用的C函数声明1.2.1 声明用于作为dll符号给外部调用1.2.2 C函数的调用规定2 ctypes加载dll库接口3 ctypes调用C函数参数传递3.1 出参为指针3.2 ...

    1 生成被调用的C dll

    1.1 C文件编译为C动态链接库

    • 在windows下,需要配置visual studio的工程设置,将工程编译为dll,细节不在这里赘述
    • gcc环境下,需要编译为.so文件,需要修改makefile的链接参数,这里也不再赘述

    1.2 用于外部引用的C函数声明

    1.2.1 声明用于作为dll符号给外部调用

    在函数声明加入前缀,如
    __declspec(dllexport) int Fun(int a, int b)
    否则在加载该dll时会提示找不到该符号

    在windows下可以通过vs自带的dumpbin工具查看可被调用符号
    dumpbin /exports test.dll

    1.2.2 C函数的调用规定

    C函数在调用过程中关于参数传递和压栈由多种规定,作为dll提供给其他程序调用时,必须明确并统一为同一种调用规定,否则会导致栈破坏,编译器负责具体实现调用规定,主要有以下几种调用规定

    调用规定声明编译符号修饰调用规则说明
    _stdcall__declspec(dllexport) int __stdcall fun(int a, int b)_fun@number参数从右向左入栈,调用者压栈,被调者负责弹栈win32 API默认调用规则
    _cdecl__declspec(dllexport)int __cdecl fun(int a, int b)_fun参数从右向左入栈,调用者负责压栈和弹栈C/C++默认调用规则
    _fastcall__declspec(dllexport)int __fastcall fun(int a, int b)@fun@number寄存器和栈共同参数与参数传递寄存器传参提高性能,难以跨平台

    2 ctypes加载dll库接口

    python下调用C库有多种方式,ctypes是其中一种比较方便的,调用时首先需要加载dll文件,根据C dll的调用规定不同需要使用不同接口,使用ctypes需要import ctypes

    • 对于stdcall的C dll
    import ctypes
    Objdll = ctypes.windll.LoadLibrary("dllpath") #接口1
    Objdll = ctypes.WinDLL("dllpath") #接口2
    

    以上两种接口都是可用的

    • 对于cdecl的C dll
    import ctypes
    Objdll = ctypes.cdll.LoadLibrary("dllpath")  
    Objdll = ctypes.CDLL("dllpath")  
    

    对于简单的C函数,例如int add(int a, int b), 此时就可以直接调用了,如

    import ctypes
    Objdll = ctypes.cdll.LoadLibrary("dllpath")  
    Objdll = ctypes.CDLL("dllpath")  
    
    c = Objdll.all(1,3)
    print(c) # 4
    

    3 ctypes调用C函数参数传递

    对于较复杂的C函数的参数情况,ctypes调用时对入参和出餐做一定处理,这里分情况讨论

    3.1 出参为指针

    • C代码
    /* Divide two numbers */
    int divide(int a, int b, int *remainder)
    {
        int quot = a / b;
        *remainder = a % b;
        return quot;
     }
    
    • python代码
    # int divide(int, int, int *)
    _divide = _mod.divide_divide.argtypes = (ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_int))_divide.restype = ctypes.c_int
    
    def divide(x, y):
        rem = ctypes.c_int()
        quot = _divide(x, y, rem)
    
        return quot,rem.value
    

    3.2 入参为字符串

    • C代码
    void PrintfInfo(char *str)
    {
        printf("the str is %s\n", str);
    }
    
    • python代码
    sBuf = 'aaaaaaaaaabbbbbbbbbbbbbb'
    pStr = ctypes.c_char_p( )
    pStr.value = sBuf.decode() #c_char_p类型的value只接受bytes类型数据
    
    dll.PrintInfo(pStr)
    

    这里使用了ctypes的内置类型c_char_p,对应于C的char数组,更多ctypes类型与C类型对照在后面附上

    3.4 入/出参为结构体

    • C代码
    
    typedef struct   
    
    {  
    
    char words[10];  
    
    }keywords;  
    
    
    
    typedef struct   
    
    {  
    
    keywords *kws;  
    
    unsigned int len;  
    
    }outStruct;  
    
    extern "C"int __declspec(dllexport) test(outStruct *o);  
    
    int test(outStruct *o)  
    
    {  
    
    unsigned int i = 4;  
    
    o->kws = (keywords *)malloc(sizeof(unsigned char) * 10 * i);  
    
    strcpy(o->kws[0].words, "The First Data");  
    
    strcpy(o->kws[1].words, "The Second Data");  
    
    
    
    o->len = i;  
    
    return 1;  
    
    }  
    
    • python代码
    # C结构体需要专门定义class对应
    class keywords(Structure):  
    
            _fields_ = [('words', c_char *10),]  
    
    
    
    class outStruct(Structure):  
    
            _fields_ = [('kws', POINTER(keywords)),  
    
                        ('len', c_int),]  
    
    o = outStruct()  
    
    dll.test(byref(o))  
    
    
    
    print o.kws[0].words;  
    
    print o.kws[1].words;  
    
    print o.len  
    

    以上包含了几种主要的参数传递情况,ctypes也提供了一个较为完整的python类型和C类型的对照,如下:
    在这里插入图片描述

    展开全文
  • .cs编译DLL文件

    千次阅读 2012-07-17 03:35:03
    1.E盘下一个Test.cs 文件。 2.开始-》程序-》Microsoft Visual Studio 2005-》Visual Studio Tools-》Visual Studio 2005 命令提示 3.命令提示符山输入:csc /target:library /out:E:\MyTestDLL.dll E:\Test.

    cs文件如何生成exe,dll文件
    以下是本人的制作过程:
    1.E盘下有一个Test.cs 文件。
    2.开始-》程序-》Microsoft Visual Studio 2005-》Visual Studio Tools-》Visual Studio 2005 命令提示
    3.命令提示符山输入:csc /target:library /out:E:\MyTestDLL.dll E:\Test.cs
    即可在E盘生成一个名为MyTestDLL的dll文件,该dll的主题是Test.cs
    备注:
    我在生成自己的DLL时出现这种错误:
    e:\DotNetBarCode.cs(8,29): error CS0234:
             命名空间“Microsoft.VisualBasic”中不存在类型或命名空间名称“CompilerServices”(是缺少程序集引用吗?)
    因为我这个类中第八行有着样的引用“using Microsoft.VisualBasic.CompilerServices;”;然而vs2005c#程序不能引用到VB中的类库。所以报错。
    我的解决办法是:
    找到我自己电脑上该VB类库的路径,引入编译。
    /reference:C:\WINDOWS\Microsoft.NET\Framework\v2
    .0.50727\Microsoft.VisualBasic.dll
    完整的语句这样:
    csc /target:library /out:E:\MyTestDLL.dll E:\Test.cs /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Microsoft.VisualBasic.dll

    祝大家解决问题!以下是摘录:
    1、打开 Microsoft .NET Framework SDK v2.0--> SDK Command Prompt
    2、指定cs文件所在的目录(如 E:)
    3、运行命令 csc /? 查看所有的命令以及各自的参数
    4、csc /target:exe *.cs (生成exe文件)----/t:exe *.cs (Short form)
    5、csc /target:library *.cs (生成dll文件)-- /t:library *.cs (Short form)

    在网上搜索到的,一般不详细,这个比较详细,果然实验成功。
    现在的问题,这个DLL如何调用?
    似乎.net的很好调用,ASP能调用吗?
    其他语言能调用吗?

     

    通过在命令行上键入 C# 编译器可执行文件的名称 (csc.exe),可以在命令行调用 C# 编译器。如果希望从计算机上的任何子目录调用 csc.exe,可能需要调整路径。

    命令行语法规则
    当解释操作系统命令行上给出的参数时,C# 编译器代码使用下面的规则:

    参数用空白分隔,空白可以是一个空格或制表符。
    ^ 字符 (^) 未被识别为转义符或者分隔符。该字符在被传递给程序中的 argv 数组前,完全由操作系统的命令行分析器进行处理。
    无论其中有无空白,包含在双引号 ("string") 中的字符串均被解释为单个参数。带引号的字符串可以嵌入在参数内。
    前面有反斜杠的双引号 (\") 被解释为原义双引号字符 (")。
    反斜杠按其原义解释,除非它们紧位于双引号之前。
    如果偶数个反斜杠后跟双引号,则每对反斜杠中的一个反斜杠放置在 argv 数组中,并且双引号被解释为字符串分隔符。
    如果奇数个反斜杠后跟双引号,则每对反斜杠中的一个反斜杠放置在 argv 数组中,双引号由其余的反斜杠“转义”,使原义双引号 (") 被放置在 argv 数组中。
    命令行示例
    编译 File.cs 以产生 File.exe:
    csc File.cs
    编译 File.cs 以产生 File.dll:
    csc /target:library File.cs
    编译 File.cs 并创建 My.exe:
    csc /out:My.exe File.cs
    通过使用优化和定义 DEBUG 符号,编译当前目录中所有的 C# 文件。输出为 File2.exe:
    csc /define:DEBUG /optimize /out:File2.exe *.cs
    编译当前目录中所有的 C# 文件,以产生 File2.dll 的调试版本。不显示任何徽标和警告:
    csc /target:library /out:File2.dll /warn:0 /nologo /debug *.cs
    将当前目录中所有的 C# 文件编译为 Something.xyz(一个 DLL):
    csc /target:library /out:Something.xyz *.cs  

    展开全文
  • cs编译DLL文件cs文件如何生成exe,dll文件以下是本人的制作过程:1.E盘下一个Test.cs 文件。2.开始-》程序-》Microsoft Visual Studio 2005-》Visual Studio Tools-》Visual Studio 2005 命令提示3.命令提示...

    cs编译成DLL文件cs文件如何生成exe,dll文件
    以下是本人的制作过程:
    1.E盘下有一个Test.cs 文件。
    2.开始-》程序-》Microsoft Visual Studio 2005-》Visual Studio Tools-》Visual Studio 2005 命令提示
    3.命令提示符山输入:csc /target:library /out:E:/MyTestDLL.dll E:/Test.cs
    即可在E盘生成一个名为MyTestDLL的dll文件,该dll的主题是Test.cs
    备注:
    我在生成自己的DLL时出现这种错误:
    e:/DotNetBarCode.cs(8,29): error CS0234:
             命名空间“Microsoft.VisualBasic”中不存在类型或命名空间名称“CompilerServices”(是缺少程序集引用吗?)
    因为我这个类中第八行有着样的引用“using Microsoft.VisualBasic.CompilerServices;”;然而vs2005c#程序不能引用到VB中的类库。所以报错。
    我的解决办法是:
    找到我自己电脑上该VB类库的路径,引入编译。
    /reference:C:/WINDOWS/Microsoft.NET/Framework/v2
    .0.50727/Microsoft.VisualBasic.dll
    完整的语句这样:
    csc /target:library /out:E:/MyTestDLL.dll E:/Test.cs /reference:C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Microsoft.VisualBasic.dll

    祝大家解决问题!以下是摘录:
    1、打开 Microsoft .NET Framework SDK v2.0--> SDK Command Prompt
    2、指定cs文件所在的目录(如 E:)
    3、运行命令 csc /? 查看所有的命令以及各自的参数
    4、csc /target:exe *.cs (生成exe文件)----/t:exe *.cs (Short form)
    5、csc /target:library *.cs (生成dll文件)-- /t:library *.cs (Short form)

    在网上搜索到的,一般不详细,这个比较详细,果然实验成功。
    现在的问题,这个DLL如何调用?
    似乎.net的很好调用,ASP能调用吗?
    其他语言能调用吗?

     

    通过在命令行上键入 C# 编译器可执行文件的名称 (csc.exe),可以在命令行调用 C# 编译器。如果希望从计算机上的任何子目录调用 csc.exe,可能需要调整路径。

    命令行语法规则
    当解释操作系统命令行上给出的参数时,C# 编译器代码使用下面的规则:

    参数用空白分隔,空白可以是一个空格或制表符。
    ^ 字符 (^) 未被识别为转义符或者分隔符。该字符在被传递给程序中的 argv 数组前,完全由操作系统的命令行分析器进行处理。
    无论其中有无空白,包含在双引号 ("string") 中的字符串均被解释为单个参数。带引号的字符串可以嵌入在参数内。
    前面有反斜杠的双引号 (/") 被解释为原义双引号字符 (")。
    反斜杠按其原义解释,除非它们紧位于双引号之前。
    如果偶数个反斜杠后跟双引号,则每对反斜杠中的一个反斜杠放置在 argv 数组中,并且双引号被解释为字符串分隔符。
    如果奇数个反斜杠后跟双引号,则每对反斜杠中的一个反斜杠放置在 argv 数组中,双引号由其余的反斜杠“转义”,使原义双引号 (") 被放置在 argv 数组中。
    命令行示例
    编译 File.cs 以产生 File.exe:
    csc File.cs
    编译 File.cs 以产生 File.dll:
    csc /target:library File.cs
    编译 File.cs 并创建 My.exe:
    csc /out:My.exe File.cs
    通过使用优化和定义 DEBUG 符号,编译当前目录中所有的 C# 文件。输出为 File2.exe:
    csc /define:DEBUG /optimize /out:File2.exe *.cs
    编译当前目录中所有的 C# 文件,以产生 File2.dll 的调试版本。不显示任何徽标和警告:
    csc /target:library /out:File2.dll /warn:0 /nologo /debug *.cs
    将当前目录中所有的 C# 文件编译为 Something.xyz(一个 DLL):
    csc /target:library /out:Something.xyz *.cs   

    展开全文
  • .CS文件编译生成.DLL文件 .EXE文件打开cmd 转到csc.exe的文件夹运行csc /t:library N:/NET/cs/*.cs N:/NET/cs/*.cs 是你的cs文件的位置正常情况下csc.exe的目录下会多个dll文件 copy出来asp.net程序是经过编译执行...
  • 之前把离屏渲染模式的Cef3作为控件嵌入到项目窗体里。现在因为工作需要,为了得到支持mp3、mp4的cef32和64位版本,我得编译cef3的...没编译之前就知道这是个大坑,果不其然,花了一星期才编译出来。看了不少网上的教程
  • .cs编译DLL文件

    千次阅读 2009-05-14 13:01:00
    cs文件如何生成exe,dll文件以下是本人的制作过程:1.E盘下一个Test.cs 文件。2.开始-》程序-》Microsoft Visual Studio 2005-》Visual Studio Tools-》Visual Studio 2005 命令提示3.命令提示符山输入:csc /...
  • 如何保护.net中的dll文件(防止破解、反编译dll)
  • 如题 函数名应该是 Java_GoodLuck_get 但是结果却是这样 _Java_GoodLuck_get@8。 这样我不能用Java调用这个DLL里面的函数啊。大神求助。
  • 编译和链接(lib和dll区别) 一、前言 初学动态链接库时,总被许多概念搞得一塌糊涂,比如“隐式链接”,“动态加载”,lib静态库和lib导入库。虽然会用,但概念还是很模糊的。后来了解了编译和链接的一些...
  • .CS文件编译生成.DLL文件(C#网络搜集) 如果没有VS用下面的办法 搜索csc.exe 打开cmd 转到csc.exe的文件夹 运行 csc /t:library N:\NET\cs\*.cs  N:\NET\cs\*.cs 是你的cs文件的位置 正常情况下csc...
  • 保护.net中的dll文件(防止破解、反编译dll)2009-12-13 19:34.net是一种建立在虚拟机上执行的语言,它直接生成 MSIL 的中间语言,再由.net编译器 JIT 解释映象为本机代码并交付CPU执行。中间语言很容易被反编译,所以...
  • 本文主要介绍64位和32位dll编译与MFC和控制台程序显式调用dll的教程。显示链接只需要.dll文件,但是这种调用方式不能调用dll中的变量或者类。至于优点无非就是方便与节省控件,既然选择了看这篇文章,优点吾不在...
  • 中间语言很容易被反编译,所以研究下如何有效的保护dll文件。 我大致的方法为 :强签名+混淆+加密。 强签名  强命名程序集,可以确保你的程序集唯一,而不被篡改、冒用等;即使相同名字的程序集如果签名也会...
  • 将webrtc的p2p模块编译dll并移植到qt

    千次阅读 2017-04-21 18:05:50
    vs2015下编译成功p2p dll,然后移植到qt中,qt使用mingw编译,那么问题来了,qt mingw编译环境和vs2015 msvc不是同一个编译系统,qt mingw自然不能像在msvc中导入dll的方式去导入 前面的 p2p dll!这个问题让我
  • 在很早之前就试过写个 dll,当时被各种符号弄晕了,现在再尝试在 VS2015 上写 dll,发现超级方便啊。不过在生成的时候发现 Release 与 Debug 的 dll 重名,直接修改名字会导致错误,最终解决了这个问题,与大家分享...
  • 如何编译加密保护.net中的dll文件(防止破解、反编译dll) 2012-03-07 11:21  .net是一种建立在虚拟机上执行的语言,它直接生成 MSIL 的中间语言,再由.net编译器 JIT 解释映象为本机代码并交付CPU执行。...
  • 如何保护.net中的dll文件(防止破解、反编译dll)(转) 转载地址:http://www.cnblogs.com/jackdong/archive/2010/08/05/1792801.html .net是一种建立在虚拟机上执行的语言,它直接生成 MSIL 的...
  • 文件名后缀带有-system32的两个文件,去除“-system32”,并且存放到C:\Windows\System32中;另外带有“-sysWOW64”,去除“-sysWOW64”,并且存放到C:\Windows\SysWOW64 这里发现C:\Windows\System32目录下是...
  • dll导出函数符号含义

    千次阅读 2014-08-29 11:38:41
    DLL中导出类成员函数名称修饰意思解释大全 2、C++编译时函数(非类成员函数)名称修饰 当函数使用__cdecl调用约定时,编译器进行以下工作:   1.以?标识函数名的开始,后跟函数名; 2.函数名后面...
  • 编译最新的SQLite 3.8.4.3为一个DLL

    千次阅读 2014-05-05 17:44:05
    SQLite是一个小型数据库,特别适合于客户端应用程序使用,它的众多好处就不多说了,兴趣的去搜索。 话说使用吧。 我们要使用,就需要调用它,现在一步一步来。 第一步:上SQLite官网...松散代码包对编译的要求比
  • 总体介绍 为什么通过Bazel编译基于Windows的动态链接库? 为什么不用cmake?因为cmake是开发人员自发...所以转用官方支撑的bazel才是正道。 安装、配置环境 -1- 安装VS2015 原因: tensorflow的编译需要用到vs20...
  • 为了实现vs2013编译的运行程序在xp下可以运行,我进行了以下操作 1. 项目菜单->项目属性->配置属性->常规->平台工具集,选择“VS2013WindowsXP(v120_xp)”;  2. 项目菜单->项目属性->配置属性-&...
  • 也就是头文件里面什么内容,通通把它移到包含这个头文件的源文件里。(我觉得这是个很重要的概念,可以帮助我们简化理解编译链接的过程,包括理解头文件中定义静态变量或静态函数是怎么回事)。编译器经过这一步...
  • VC与Matlab混合编程(在VC中调用DLL) Matlab 作为当今世界上应用最为广泛的数学软件, 具有非常强大的数值计算、数据分析处理、系统分析、图形显示甚至符号运算的功能。已经在如生物工程,图像处理,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,541
精华内容 9,016
关键字:

编译带有符号的dll