c++ 怎么调用 dll?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 怎么调用 dll?相关的知识,希望对你有一定的参考价值。

c++ 怎么编写dll ,c++ 怎么调用 dll?,能给出实例吗?

第一行添加导出函数extern "C" int __declspec(dllexport) add(int,int);
第二行添加函数实体
int add(int x,int y)
return (x+y)

第三行添加入口函数 VC++需要添加 gcc不需要添加
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)

switch(ul_reason_for_call)

case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;

return TRUE;
参考技术A //dll.h
extern "C" int __declspec(dllexport) add(int,int);
//dll.cpp
#include <windows.h>
#include "dll.h"
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)

switch(ul_reason_for_call)

case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;

return TRUE;


int add(int a,int b)

return a+b;


exe工程:
//main.cpp
#include <windows.h>
#include <iostream>
#include <tchar.h>
using namespace std;

int main()

HINSTANCE hDll; //dll 句柄
hDll=LoadLibrary(TEXT("win.dll")); //加载dll
cout<<hDll<<endl;
typedef int(* lpAddFun)(int,int); //宏定义函数指针类型
typedef int(* lpSubFun)(int,int);

lpAddFun addFun; //函数指针
lpSubFun subFun;

int * num;

if(hDll!=NULL) //判断dll加载是否成功

addFun=(lpAddFun)GetProcAddress(hDll,"add"); //获取想要引入的函数以及变量
subFun=(lpAddFun)GetProcAddress(hDll,"sub");
num=(int *)GetProcAddress(hDll,"num");

if(num!=NULL)

printf("%d\n",* num);

if(addFun!=NULL)

int result=addFun(3,2);
printf("3+2=%d\n",result);

if(subFun!=NULL)

int result=subFun(3,2);
printf("3-2=%d\n",result);

FreeLibrary(hDll); //卸载dll

return 0;

如果还是不明白,我给你发vs2008下的源代码。追问

vs2008下的源代码

java调用C#封装的DLL文件

由于要和硬件打交道,公司里有同事把硬件接口用C#封装了一道。现在项目里要用java来开发,要用java调用这些C#封装的dll。
不想用jni,我想直接用jna来处理。但是用jna,java无法直接调用C#封装的dll接口,我想用C++来再次封装C#的dll,然后java来调用C++再封装的dll。java调用C++封装的dll成功,但是不晓得怎么用C++再封装C#的dll并能让java调用。请求帮助!qq396921623
注意是 C++再把C#封装的dll封装一次,留接口给java调用的,谢谢!
例如,我 用C#封装了一个dll,其cs的主要内容如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CreatDll

public class TestA


public int add(int x,int y)

int z = x + y;
return z;



然后生成了一个CreatDll.dll,那么我在C++中再如何封装它,以便我java再调用c++封装的dll

望穿秋水待伊人
非也!
1. 如果你愿意采用COM组件的方式,可以一试!JAVA有COM4Java的组件(我没记错的话)。
先将C#的dll用COM Callerable Wrapper(CCW)封装一下,在C++中编写COM dll调用C#的托管dll,之后在Java中使用COM4J组件访问这个C++编写的COM dll组件!
如果不明白,使用Google或者Bing搜索下CCW和RCW。
2. webservice
估计你不会这样做的,也没必要
3. 重写下吧,用C++
参考技术A

先写一个java类,Java代码:

package com.ypoj.jni;  
  
public class TestJNI   
  
    public native int add(int a, int b);  
  
    static   
        System.loadLibrary("CallCS");  
      
    public static void main(String[] args)   
        TestJNI t = new TestJNI();  
        System.out.println(t.add(10, 20));  
      

用javah生成的com_ypoj_jni_TestJNI.h,Cpp代码: 

#include <jni.h>  
#ifndef _Included_com_ypoj_jni_TestJNI  
#define _Included_com_ypoj_jni_TestJNI  
#ifdef __cplusplus  
extern "C"   
#endif  
JNIEXPORT jint JNICALL Java_com_ypoj_jni_TestJNI_add  
  (JNIEnv *, jobject, jint, jint);  
#ifdef __cplusplus  
  
#endif  
#endif

接下来先完成C#的 Dll,C#代码:

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace OJMain  
  
    public class OJEntrance  
      
        private int result;  
        public int Result  
          
            get  return result + 10;   
            set  this.result = value;   
          
      

参考技术B C#的DLL都用的运行时,需要.net frame work 支持,想用C++封装,也同样需要使用运行时,这样做的还是脱离不了.net frame work ,而且这样形成 的dll能不能被java调用还是个未知数,不过你可以试试,用c++.net的语法进行封装。不过我感觉还是看下源代码自己用C++实现吧。追问

最后一步java实现调用的时候出现失败,导致jvm出现A fatal error

追答

C#做的DLL跟标准的DLL不是同一种类型,不支持。net的语言很难去调用 ,所以我建议你自己用C++做一份。

参考技术C 又是.net framework ,又是jre的,这机器得装多少东西。硬件接口底层是c写的吗?c#封装硬件接口还真没有见过。追问

确实很蛋疼的,我也是第一次碰到这种,用C#封装的硬件然后又要让java去调用。没法,领导要求,先做出来再说呗。硬件底层什么语言不管它,领导只要求我用java实现调用C#封装的dll

以上是关于c++ 怎么调用 dll?的主要内容,如果未能解决你的问题,请参考以下文章

c++调用dll导出函数

python 调用 C++的DLL,函数参数是数组怎么处理?

怎么查看用C++ builder编写的程序都调用了哪些dll文件,谢谢!

java调用C#封装的DLL文件

C# 调用C++ DLL,而c++函数的有一个参数需要是null,该怎么传递?

Delphi调用C++编写的DLL