VC++6.0、VS创建、生成DLL,JAVA调用DLL,VC++、VS调用DLL

JNA、JNative、JInvoke、VC创建DLL、调用测试下载

1-1、VC++6.0创建DLL

新建工程,选择Win32 Dynamic-Link Library,工程名称CreateDLL。点击确定。

一个简单的DLL工程,完成。

新建头文件testdll.h,确定。

​#ifndef TestDll_H_
#define TestDll_H_
#ifdef MYLIBDLL
#define MYLIBDLL extern "C" _declspec(dllimport) 
#else
#define MYLIBDLL extern "C" _declspec(dllexport) 
#endif
MYLIBDLL int Add(int plus1, int plus2);
//You can also write like this:
//extern "C" {
//_declspec(dllexport) int Add(int plus1, int plus2);
//};
#endif

​

新建testdll.cpp,确定。

#include "stdafx.h"
#include "testdll.h"
#include <iostream>
using namespace std;
int Add(int arg0, int arg1)
{
    int result = arg0 + arg1;
    return result;
}

编译组建之后,CreateDLL\Debug下即生成CreateDLL.dll。

1-2、VS创建DLL

新建Win32项目或Win32控制台程序,名称CreateDLL,确定。

下一步。

选择DLL,完成。

生成如下。

右键-添加-新建项:头文件CreateDLL.h

CreateDLL.h

extern "C" _declspec(dllexport)//导出
int Add(int x, int y);

 CreateDLL.cpp

extern "C" _declspec(dllexport)
int Add(int x, int y)
{
	return x+y;
}

编译-生成,在Create\Debuge下生成CreateDLL.dll 

2-1、JAVA-JNA调用DLL

将dll复制到项目根目录。

引入jna.jar

TestJNA.java

import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;

public class TestJNA {

	public interface jnatest extends StdCallLibrary {
		jnatest INSTANCE = (jnatest) Native.loadLibrary("msvcrt", jnatest.class);
		void printf(String format, Object... args);
	}

	public interface CreateDLLTest extends StdCallLibrary {
		CreateDLLTest INSTANCE = (CreateDLLTest) Native.loadLibrary("CreateDLL", CreateDLLTest.class);
		int Add(int plus1, int plus2);
	}

	public static void main(String[] args) {
		jnatest.INSTANCE.printf("Hello, World\n");
		int result = CreateDLLTest.INSTANCE.Add(1,2);
		System.out.println("结果为" + result);
	}
}

2-2、JAVA-JNative调用DLL

将dll复制到项目根目录。

引入JNative.jar

TestJNative.java

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.Type;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.util.Kernel32.SystemTime;

public class TestJNative {

	/**
	 * 获取系统时间
	 * @return
	 * @throws NativeException
	 * @throws IllegalAccessException
	 */
	public static SystemTime GetSystemTime() throws NativeException, IllegalAccessException {
		// Kernel32.dll为dll名称,Kernel32目录的位置为:C:\Windows\System32下面,
		// GetSystemTime为Kernel32.dll中的一个方法.
		JNative nGetSystemTime = new JNative("Kernel32.dll", "GetSystemTime");
		SystemTime systemTime = new SystemTime();
		// 设置参数
		nGetSystemTime.setParameter(0, systemTime.getPointer());
		nGetSystemTime.invoke();
		// 解析结构指针内容
		return systemTime.getValueFromPointer();
	}

	/**
	 * 编写调用dll例子 加法测试
	 * @return
	 * @throws NativeException
	 * @throws IllegalAccessException
	 */
	public static int Add(int a, int b) throws NativeException, IllegalAccessException {
		JNative jnative = new JNative("CreateDLL.dll", "Add");
		jnative.setRetVal(Type.INT);
		jnative.setParameter(0, Type.INT, ""+a);
		jnative.setParameter(1, Type.INT, ""+b);
		jnative.invoke();
		return jnative.getRetValAsInt();
	}
	public static void main(String[] args) throws IllegalAccessException, NativeException {
		System.out.println(GetSystemTime());
		System.out.println(Add(3, 4));
	}

}

2-3、JAVA-JInvoke调用DLL

将dll复制到项目根目录。

引入jinvoke.jar

TestJInvoke.java

import com.jinvoke.JInvoke;
import com.jinvoke.NativeImport;

public class TestJInvoke {

	@NativeImport(library="User32") 
	public static native int MessageBox(int hwnd,
			String text, String caption, int type); //windows Api MessageBox函数原型 

	@NativeImport(library="CreateDLL") 
	public static native int Add(int a, int b); 

	public static void main(String[] args) {
		JInvoke.initialize(); 
		MessageBox(0,"JInvoke测试成功", "消息框",0);
		System.out.println(Add(5, 6));
	}

}

3-1、VC++调用DLL

新建工程,选择Win32 Console Application,工程名CallDLL,确定。

一个简单的程序,完成。

CallDLL.cpp

#include "stdafx.h"

#include <iostream>
#include<windows.h>
#include<string>
using namespace std;
int main()
{
    int a,b;
    typedef int(*pTest)(int a,int b);//函数指针
    pTest Test=NULL;
    HINSTANCE hDLL;
    hDLL=LoadLibrary("CreateDLL.dll");//加载动态链接库CreateDLL.dll文件,或全路径E:\\VC\\CallDLL\\Debug\\CreateDLL.dll
	if (hDLL!=NULL)
	{
		cout<<"加载dll成功"<<endl;
		Test=(pTest)GetProcAddress(hDLL,"Add");
		if (Test)//如果取出函数成功,则执行下面的语句
		{
			cout<<"取出函数成功"<<endl;
			cout<<"请输入一个整数a=";
			cin>>a;
			cout<<"请输入一个整数b=";
			cin>>b;
			int C=Test(a,b);
			cout<<C<<endl;
			cout<<"OK!"<<endl;
		}
		else
		{
			cout<<"取出函数失败"<<endl;
		}
	}
	else
	{
        cout<<"加载dll失败"<<endl;
	}
    FreeLibrary(hDLL);//卸载CreateDLL.dll文件;
    return 0;
}

3-2、VS调用 DLL

新建win32控制台应用程序,CallDLL

(1)隐式链接

隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。

CreateDLL.dll和CreateDLL.lib拷贝到当前工程所在的目录下面(\CallDLL\CallDLL)

HideCallDLL.h

#pragma comment(lib,"CreateDll.lib")
extern "C"_declspec(dllimport) int Add(int x,int y);

HideCallDLL.cpp

#include "stdafx.h"
#include "HideCallDLL.h"

void main()
{
	int result = 0;
	result = Add(1, 2);
	printf("和为%d\n",result);
	getchar();
}

 调试-开始调试(不执行)Ctrl+F5

(2)显式链接

显式链接是应用程序在执行过程中随时可以加载DLL文件,也可以随时卸载DLL文件。

CreateDLL.dll复制到当前工程所在的目录下面(\CallDLL\CallDLL)

(main方法在哪个里面就执行哪个cpp)

CallDLL.cpp

#include "stdafx.h" 
#include <iostream>
#include<windows.h>
#include<string>
using namespace std;

int main()
{
	int a,b;
    typedef int(*lpAddFun)(int a,int b);//函数指针,或typedef int(*lpAddFun)(int ,int );
	lpAddFun addfun=NULL;
	HINSTANCE hDLL;
	hDLL=LoadLibrary(L"CreateDLL.dll");//加载动态链接库CreateDLL.dll文件,或全路径E:\\VS\\CallDLL\\CallDLL\\CreateDLL.dll
	if (hDLL!=NULL)
	{
		printf("加载dll成功\n");
		addfun=(lpAddFun)GetProcAddress(hDLL,"Add");
		if (addfun)//如果取出函数成功,则执行下面的语句
		{
			printf("取出函数成功\n");
			cout<<"请输入一个整数a=";
			cin>>a;
			cout<<"请输入一个整数b=";
			cin>>b;
			int result = 0;
			result = addfun(a, b);
			printf("和为%d\n",result);
			printf("OK\n");
		}
		else
		{
			printf("取出函数失败\n");
		}
	}
	else
	{
		printf("加载dll失败\n");
	}
	FreeLibrary(hDLL);//卸载动态链接库;
	getchar();
	getchar();
	return 0;
}

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值