搜档网
当前位置:搜档网 › Unity 3D 调用DLL的方法

Unity 3D 调用DLL的方法

Unity 3D 调用DLL的方法
Unity 3D 调用DLL的方法

接触Unity 3D 时间不长,看到网上有人问怎么通过Unity来调用Dll,而且发现这个问题似乎是用unity的朋友并不熟悉DLL的使用造成的,正好我使用过C++,对DLL还比较熟悉,因此写了一个小小的教程来谈谈unity的Dll调用方法。更多精彩请关注【狗刨学习网】

1.创建DLL

困扰Unity人员的主要问题大概出于Dll不会生成。这个确实比较麻烦,我这里给出一个vs 2008中创建DLL的方法。

1)首先打开vs2008,当然2005或者2003也都差不多。我这里用的是2008.

在C++项目中选择Win32程序,然后在控制台程序或者win32程序任选一个。写上项目名字点创建。

2) 任选一个的原因是这里并不重要,重要的是下一步,创建以后会出现一下这个面板。选下一步见如下选项:

注意,首先选DLL,证明我们这个程序是个dll项目。选“空项目”的目的是建一个计较干净的DLL程序,里面的代码都有我们手写完成,这样写过什么我们都知道。

3)创建项目,这样我们得到一个空项目,在这个项目中,除了几个文件加以外什么也没有,我们在文件夹上点右键,创建新项。在新项里面分别创建一个CPP文件和一个头文件。

4)得到如下的两个文件:起什么名字并不重要

5)以下是2个文件的代码:DLL的生成要说起来也一大堆的知识,我这里简单的说一下,dll的使用和生成用的宏不同,上面的代码主要是区分在不同环境中该使用那个宏,如果不理解就不要管了,你们只需要改最下面的哪个函数就行了。

头文件

/////////////////// DLL.h /////////////////////////////

1.

2.#if defined (EXPORTBUILD)

3.# define _DLLExport __declspec (dllexport)

4.# else

5.# define _DLLExport __declspec (dllimport)

6.#endif

7.

8.extern "C" int _DLLExport MyADD(int x,int y);

复制代码

代码文件

////////////////// DLL.cpp ////////////////////////////

1.//宏定义

2.#define EXPORTBUILD

3.

4.//加载头文件

5.#include "DLL.h"

6.

7.//设置函数

8.int _DLLExport MyADD(int x,int y)

9.{

10. return x+y;

11.}

复制代码

这样我们就生成了一个MyAdd()函数,传入两个数就会返回它们的和。然后编译这个程序,会出现下面的对话框,那就证明你成功了!然后再把这个DLL文件放在你的unity 工程的assert的Plugins(如果没有这个文件夹就手动创建一个)。

6) 在unity中创建一个C#脚本,调用我们刚刚生成的dll,在这里我们的DLL名字就叫DLL,所以写的是[DllImport ("DLL")] ,如果你的名字是Test.dll,那就写[DllImport ("Test")]

写一个GUI按钮上显示运行的结果。

https://www.sodocs.net/doc/1b4860342.html,ing UnityEngine;

2.

https://www.sodocs.net/doc/1b4860342.html,ing System.Collections;

4.

https://www.sodocs.net/doc/1b4860342.html,ing System.Runtime.InteropServices;

6.

7.public class NewBehaviourScript : MonoBehaviour {

8.

9. [DllImport ("DLL")]

10. private static extern int MyADD(int x,int y);

11. int i = MyADD(5,7);

12. // Update is called once per frame

13. void Update () {}

14. void OnGUI()

15. {

16. GUI.Button(new Rect(1,1,200,100),"this DLL i = 5+7, i is

'"+i+"'");

17. }

18.}

复制代码

运行通过就可以在界面上看到

7)输出unity项目exe到目录,然后在目录中也添加Plugins目录,把DLL文件也考进去,然后点运行,呵呵成功了吧!

以上是unity 输出exe到win32系统的情况,下来看一看如何在其他平台上调用DLL。

Android环境:

https://www.sodocs.net/doc/1b4860342.html,ing UnityEngine;

https://www.sodocs.net/doc/1b4860342.html,ing System.Runtime.InteropServices;

3.

4.class SomeScript : MonoBehaviour {

5. // This tells unity to look up the function FooPluginFunction

6. // inside the plugin named "PluginName"

7. [DllImport ("PluginName")]

8. private static extern int MyADD(int x,int y);

9.

10. void Awake () {

11. // Calls the FooPluginFunction inside the PluginName plugin

12. // And prints 5 to the console

13. int i = MyADD(5,7);

14. }

15.}

复制代码

由于没有Android机器测试,不知道是不是可以用,不过官方文档这么写的,应该不是什么大问题。

4:一个经典的多线程同步问题汇总

一个经典的多线程同步问题 程序描述: 主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep(50) -> 全局变量++ -> sleep(0) -> 输出参数和全局变量。 要求: 1.子线程输出的线程序号不能重复。 2.全局变量的输出必须递增。 下面画了个简单的示意图: 分析下这个问题的考察点,主要考察点有二个: 1.主线程创建子线程并传入一个指向变量地址的指针作参数,由于线程启动须要花费一定的时间,所以在子线程根据这个指针访问并保存数据前,主线程应等待子线程保存完毕后才能改动该参数并启动下一个线程。这涉及到主线程与子线程之间的同步。 2.子线程之间会互斥的改动和输出全局变量。要求全局变量的输出必须递增。这涉及到各子线程间的互斥。 下面列出这个程序的基本框架,可以在此代码基础上进行修改和验证。 //经典线程同步互斥问题 #include #include #include long g_nNum; //全局资源 unsigned int__stdcall Fun(void *pPM); //线程函数 const int THREAD_NUM = 10; //子线程个数 int main() { g_nNum = 0;

HANDLE handle[THREAD_NUM]; int i = 0; while (i < THREAD_NUM) { handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL); i++;//等子线程接收到参数时主线程可能改变了这个i的值} //保证子线程已全部运行结束 WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE); return 0; } unsigned int__stdcall Fun(void *pPM) { //由于创建线程是要一定的开销的,所以新线程并不能第一时间执行到这来int nThreadNum = *(int *)pPM; //子线程获取参数 Sleep(50);//some work should to do g_nNum++; //处理全局资源 Sleep(0);//some work should to do printf("线程编号为%d 全局资源值为%d\n", nThreadNum, g_nNum); return 0; } 运行结果:

LabVIEW调用动态链接库dll

/DE9,(:) W ??GOO &/1 ??- &/1 &DOO /LEUDU\ )XQFWLRQ 1RGH ?? ? ?? ?? ) - ) ? ) ? /LEUDU\ QDPH RU SDWK '// <+? "+? '// ??? γ I+? -/ '// ?? ?? ?) -- '// 9, ??p '//? ??p /DE9,(: ? W ??'// 1 6SHFLI\ SDWK RQ GLDJUDP - ? - - -- - /LEUDU QDPH RU SDWK ??? ?v? - # ) &/1 ?? ??? ǎ ? ? '// +? - ?9, ? '// ??p ?- ? ? - '//? ?1J ??p )XQFWLRQ QDPH c ) /DE9,(: 1'//?? . ′ ? ?- γ 7KUHDG ǎ?t ? /- ) ? J? ) ?# /DE9,(: ?? ? W -?? ? &DOOLQJ FRQYHQWLRQ ǎ ) ) ?t -/ ?t VWGFDOO < & FDOO ? ) Z ǎ VWGFDOO ) #** & FDOO ) # - ?? ) $ ? /DE9,(: ? ? t ? ? ) 8 /DE9,(: ) '// ? G? # - ?? ? :LQGRZV $3, ?? . VWGFDOO O& ? ? & FDOO 8 ? ń?BBVWGFDOO - ? p ?? VWGFDOO

?? ? ?? - . ? )? ? ǎ('//?? . ) ? -. ) ?t ?? ? ??? ? 8 (5HVHUYH - - ) ?)? ? ) - '// - ) G ) - ( ? ? ? ?> ? 8 ? ? -- '// ? " ? b) 8QUHVHUYH ? t ) $ERUW ? t 9, ? " ) 8 $ERUW ? 9,?? # ? - ? -/ ) ? '// # ??t ?? ? ? ? 3URWRW\SH IRU WKHVH SURFHGXUHV ? ? 8 ?? '// ( /DE9,(: ?? ? - )

vb调用vc 的DLL

4.1 新建工程 打开在VC++6.0,new一个Win32-Dynamic-Link Library工程dlltest。 4.2 在工程中添加代码 4.2.1添加lib.h文件: #ifndef _LIB_H_ #define _LIB_H_ extern “C” int __stdcall add(int,int) ; extern “C” int __stdcall sub(int,int) ; /* __stdcall 约定 如果通过VC++ 编写的DLL 欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall 方式, WINAPI 都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall 方式与__cdecl 对函数名 最终生成符号的方式不同 */ #endif 4.2.2添加lib.cpp文件: #include “lib.h” int __stdcall add(int a,int b) { return a+b ; } int __stdcall sub(int a,int b) { return a-b ; } 4.2.3添加lib.def文件: 右击SOURCE FILE目录,添加一个文本文件(不能是word文档,一般是txt 格式的),将文档重命名为lib.def,点击打开该文档。 在文档中输入代码: LILBRARY dlltest EXPORTS add @ 1 sub @ 2 说明:DLL函数的导出有两种方式。

一种是显式导出:在.h文件中在函数声明前加入如下语句: __declspec(dllexport)。使用该方法是不用添加.def文档的。该方法导出的函数,只能被C或C++调用,不能被其他语言调用。 一种是隐式导出:就是在SOURCE FILE目录中添加一个.def文档,在该文档中写入要导出函数的代码。 .def语法规定注释用分号(;),且注释不能与代码共享一行,代码说明如下:LIBRARY dlltest ;该语句说明了相应的DLL工程。 EXPORTS add @ 1 sub @ 2 ;该语句声明了将DLL工程中导出的函数,只要写入 ;函数名称即可,不用说明返回值以及函数参数。其实@ 1 ;和@ 2是为函数编号所使用的 在添加所有的工程文件后,编译生成dll文件后 4.3 用vc调用DLL 在vc中new一个Win32 Console Application 工程test 代码如下: #include #include typedef int (__stdcall *padd)(int,int) ; typedef int (__stdcall *psub)(int,int) ; int main() { HINSTANCE hd ; hd = LoadLibrary(“填入要调用DLL的路径”) ; if(!hd) { printf(“Load DLL err\n”) ; return 0 ; } padd add = (padd)GetProcAddress(hd,“add”) ; if(!add) { printf(“Get add err\n”) ; FreeLibrary(hd) ; return 0 ; }

C#多线程函数如何传参数和返回值

C#多线程函数如何传参数和返回值 提起多线程,不得不提起委托(delegates)这个概念. 我理解的委托就是具有同样参数和返回值的函数的集合. 比如 public delegate void MyDelegate(int arg); 就是这种形式的函数 void Myfuntion(int i); 的集合. 如何将一个函数加入委托的集合? MyDelegate dele = new MyDelegate(Myfuntion1); 再增加一个 dele += new MyDelegate(Myfuntion2); ... 委托函数 dele 就是具有整数参数和空返回值的函数 Myfuntion1,2的集合. 调用这个委托函数 dele(1); 就是逐个调用 Myfuntion1,2,... 一般线程函数的声明和启动 Thread t = new Thread(new ThreadStart(MyFunction)); t.Start(); 正是调用了没有参数和返回值的委托函数 ThreadStart 其中的参数MyFunction 是这个委托函数中的一员. 很明显这样无法传参数和返回值,那我们该怎么办? 答案就在委托的BeginInvoke() 方法上, BeginInvoke() 也是(异步)启动一个新线程. 例如 MyDelegate dele = new MyDelegate (MyFunction); dele.BeginInvoke(10,"abcd"); void MyFunction(int count, string str); 可以实现参数的传递. 如何收集线程函数的返回值? 与BeginInvoke 对应有个 EndInvoke 方法,而且运行完毕返回 IAsyncResult 类型的返回值.这样我们可以这样收集线程函数的返回值 MyDelegate dele = new MyDelegate (MyFunction); IAsyncResult ref = dele.BeginInvoke(10,"abcd"); ...

LABVIEW的DLL与API调用

LABVIEW的DLL与API调用 一.实验目的 1.熟悉LabVIEW调用动态链接库的过程 2.学会编写用LabVIEW调用WINDOWS的API函数 二.实验器材 1.计算机(带有声卡) 2.LABVIEW8.20软件 三.实验原理 在开发自动测量系统时,经常遇到计算机与仪器的通信问题,涉及仪器控制及数据处理问题,LabVIEW语言在这一领域的应用有着独到的优势。为了在LabVIEW中能够充分利用其他编程语言的优势,LabVIEW提供了外部程序接口能力,包括动态链接库(DLL)、C语言接口(CIN)、ActiveX和Matlab等。 动态链接库是基于Windows程序设计的一个非常重要的组成部分。LabVIEW 开发中使用DLL,可以使代码更简洁,内存资源的使用更经济,而且可以便捷地利用仪器厂商或第三方提供的仪器控制子程序加速开发进程。而windows平台包含有大量的API函数,这些API函数提供了大量在Windows环境下可操作的功能,它们位于Windows系统目录下的多个DLL文件中,因此在LabView中调用API 函数和DLL的方法是一致的。 在LabVIEW中,利用库函数节点可以较容易地实现对DLL的调用,从而提高了程序的开发效率。使用调用库函数节点,可以调用Windows标准的动态连接库,也可以调用用户自己编制的DLL。LabView中动态链接库的调用可在程序框图的函数选板中选取“调用库函数节点”来完成,该节点位于:互连接口->库和可执行程序->调用库函数节点。

将选择好的调用库函数节点图标放在程序框图中,然后通过对它的节点图标进行配置,可以指定DLL模块中与LabVIEW数据交换的相应的驱动函数。 在调用DLL时,首先要找到找到头文件(*.h)或者函数原型声明,确定你需要调用的函数,注意函数的参数是否包含了原始数据类型参数比如int,char, double,等等或者是否包含了复杂数据类型比如clusters。如果函数没有包含复杂数据类型并且你有头文件(*.h),该DLL在数据类型的定义上与LabView一致,那么LabVIEW中一个很好的工具可以帮你简单地导入DLL(并且会帮助你创建DLL的整个库)。你可以在工具—>导入—>共享库(.dll)...中找到该工具,按照向导进行下去。 如果函数不含有复杂数据类型但是没有头文件(*.h),或者由于DLL编写不够规范,在数据类型的定义上与LabView并不完全一致,你需要确定那些在DLL 中被调用的函数的参数,一旦参数被确定,使调用库函数节点中的函数手动调用该函数。这是你需要对调用的函数进行手工配置。 在调用DLL库中函数时,必须知道以下信息:函数返回的数据类型、函数调用的方式、函数的参数及类型、DLL库文件的位置等。右键单击调用库函数图标,在弹出的菜单选项中选择配置...选项,可得到下图所示的配置对话框。

VB调用动态链接库(DLL)

VB调用动态链接库(DLL) 作为一种简单易用的Windows开发环境,Visual Basic 从一推出就受到了广大编程人员的欢迎。它使程序员不必再直接面对纷繁复杂的Windows消息,而可以将精力主要集中在程序功能的实现上,大大提高了编程效率。但凡事有利必有弊。 VB中高度的封装和模块化减轻了编程者的负担,同时也使开发人员失去了许多访问低层API函数和直接与Windows 交互的机会。因此,相比而言,VB应用程序的执行效率和功能比C/C++或Delphi生成的程序要差。为了解决这个问题,在一个大型的VB开发应用中,直接调用Windows API函数几乎是不可避免的;同时,还有可能需要程序员自己用 C/C++等开发一些动态连接库,用于在VB中调用。本文主要讨论在32位开发环境Visual Basic 5.0中直接调用Windows 95 API函数或用户生成的32位动态连接库的方法与规则。 Windows动态连接库是包含数据和函数的模块,可以被其它可执行文件(EXE、DLL、OCX 等)调用。动态连接库包含两种函数:输出(exported)函数和内部(internal)函数。输出函数可以被其它模块调用,而内部函数则只能在动态连接库内部使用。尽管动态连接库也能输出数据,但

实际上它的数据通常是只在内部使用的。使用动态连接库的优点是显而易见的。将应用程序的一部分功能提取出来做成动态连接库,不但减小了主应用程序的大小,提高了程序运行效率,还使它更加易于升级。多个应用程序共享一个动态连接库还能有效地节省系统资源。正因为如此,在Windows系统中,动态连接库得到了大量的使用。 一般来说,动态连接库都是以DLL为扩展名的文件,如Kernel32.dll、commdlg.dll等。但也有例外,如16位Windows 的核心部件之一GDI.exe其实也是一个动态库。编写动态连接库的工具很多,如VisualC++、BorlandC++、Delphi等,具体方法可以参见相关文档。下面只以Visual C++5.0为例,介绍一下开发应用于VisualBasic5.0的动态连接库时应注意的问题(本文中所有涉及C/C++语言或编译环境的地方,都以VC5为例;所有涉及VisualBasic的地方都以VB5 为例)。 作为一种32位Windows应用程序的开发工具,VB5生成的exe文件自然也都是32位的,通常情况下也只能调用32位的动态连接库。但是,并不是所有的32位动态库都能被VB生成的exe 文件正确地识别。一般来说,自己编写用于VB应用程序调用的动态连接库时,应注意以下几个方面的问题: 1、生成动态库时要使用__stdcall调用约定,而不能使用缺省的__cdecl调用约定;__stdcall 约定通常用于32位API

基于多线程的制造数据分析和可视化

2007年第24卷第10期微电子学与计算机105 4实例 焊膏印刷是SMT生产过程中的主要工序之一.下面以实现焊膏印刷的焊膏印刷机为例.对上述的原理和过程进行验证。 焊膏印刷机是通过在印刷设备的PC机中插入符合开放标准GEM/SECSlI(通用设备模型)的主机通信卡来实现关键信息的采集。所采集的数据类型包括:前刮刀压力、前刮刀印刷速度、后刮刀压力、后刮刀印刷速度、刮刀正行程位置、刮刀负行程位置、温度值、湿度值等。 该系统首先进入用户登录界面:根据用户的不同权限等级.给与不同的操作许可。选择不同的设备、订单名称、工艺文件名称,开始生产后,焊膏印刷机能方便的实时显示界面。选择想要绘制盖—霄控制图的数据类型.即可绘制出该数据类型的盖—月控制图。如图4所示。 图4-_一R控制图显示界面 5结束语 由于采用了多线程、数据动态实时显示、多媒体定时器、夏—R控制图等技术,使程序实现了对多设备大数据量的实时数据采集、存储、绘制曲线,及时判断数据是否处于失控状态.缩短了延时时间。制造数据可视化程度达95%以上为车间的操作人员提供了随时了解设备运行情况的有效手段.在现实应用中具有广泛的实用价值。 当然.程序也存在一些不足。程序运行在WindowsXP操作系统下.多任务操作系统固有的任务切换:其他驱动程序的CPU时间的抢占;高优先级应用程序的执行:不确定的操作系统的作业任务分配规则等许多问题.都可以导致多媒体定时器定时的不准确。所以,要提高精度.可以考虑采用专门的硬件电路。通过软硬件相结合,以达到高精度的定时,提高应用程序的实用性。 参考文献: 【1】帅梅,王爱周,王广毙.基于Windows数控系统得多线程实现叨.机床与液压.2003 【2】吴丽娜.高槛阳.Wmdows2000/XP下通用实时采集的设计与实现Ⅱ1.计算机应用,2005 【3】肖建明,张向利.一种改进的时间片轮转调度算法田.计算机应用.2005 『41杨乐,王厚军,戴志坚.测试仪器中的动态波形绘制技术叨.仪器仪表学报,2006 『51曹祁,杜树旺.基于微机的压缩机数据采集方法研究与实现U1.仪器仪表学报.2006 【6】杨桂元.中心极限定理及其在统计分析中的应用【J】.管理工程学报.1998 作者简介: 王小婷女.(1969一)。研究方向为计算机工程与应用。 韩方女.研究生。研究方向为图形图像处理、制造过程仿真与优化。 (上接第101页) 网络系统中节点之间的相互作用导致了系统在宏观上表现出了复杂的整体行为.这些结果与已有的研究结果是相一致的日。 4结束语 文中建立了用于分析网络流量行为的一维元胞自动机模型.以节点发送数据分组的规则来描述在传输数据分组过程中节点间的相互影响以及自组织作用后使计算机网络分组传输系统表示出来的一种整体行为.模拟了网络系统发送数据分组随机的不确定状态。仿真结果说明该模型能较好地描述网络流量非拥塞相到拥塞相的变化过程。参考文献: 【1]WolframS.Cellularautomataandcomple6xity[M].RendingMA,Addison-Wesley,1994 【2】彭麟,谭惠丽,孔令江,等.开放性边界条件下双道元胞自动机变通流模型耦合效应研究Ⅱ].物理学报,2003,52(12):3007-3013 p]Ohira T,sa砌嘶凡PhasetransitioninEeom!tⅫltertlet?worktmmemodd田.P}-y8.Rev,1998:193-195 作者简介: 雷霆男.(1972-).博士研究生。讲师。研究方向为通信与信息系统、计算机网络。 余镇危 男.(1942一),教授。研究方向为计算机网络。

LabVIEW与外部程序间DLL文件的调用

LabVIEW与外部程序间DLL文件的调用 什么是DLL文件 DLL(动态链接库)文件是Dynamic Link Library的缩写形式,是一种允许程序共享执行特殊任务所必需的代码和其他资源的可执行文件。其多数情况下是带有DLL扩展名的文件,但也可能是EXE或其他扩展名。Windows提供的DLL文件中包含了允许基于Windows 的程序在Windows环境下操作的许多函数和资源。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。这些函数的可执行代码位于一个DLL中,该DLL包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL还有助于共享数据和资源,多个应用程序可同时访问内存中单DLL副本的内容。总之,DLL是一个包含可由多个程序同时使用的代码和数据的库。动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位信息,Windows才转去执行DLL中相应的函数代码。 由于向运行于Windows操作系统下的程序提供代码、数据或函数,程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。在Windows操作系统中,DLL对于程序执行是非常重要的, 因为程序在执行的时候, 必须链接到DLL文件, 才能够正确地运行。而有些DLL文件可以被许多程序共用,因此程序设计人员可以利用DLL文件, 使程序不至于太过巨大。但是当安装的程序越来越多,DLL文件也就会越来越多, 如果当删除程序的时候, 没有用的DLL文件没有被删除的话, 久而久之就造成系统的负担了。 通过使用DLL,程序可以实现模块化,由相对独立的组件组成。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。例如,可能有一个工资计算程序,税率每年都会更改,当这些更改被隔离到DLL中以后,我们无需重新生成或安装整个程序就可以应用更新。 总的来说,使用DLL文件有以下好处:1、多个应用程序可以共享代码和数据。比如Office软件的各个组成部分有相似的外观和功能,这就是通过共享动态链接库实现的。2、在钩子程序过滤系统消息时必须使用动态链接库。3、动态链接库以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与合作,而且各个模块可以独立升级。如果小组中的一个成员开发了一组实用例程,他就可以把这些例程放在一个动态链接库中,供其他成员使用。4、实现应用程序的国际化,往往需要使用动态链接库。使用动态链接库可以将针对某一国家、语言的信息存放在其中。例如,在使用AppWizard生成应用程序时,我们可以指定资源文件使用的语言,这就是通过提供不同的动态链接库实现的。对于不同的版本,使用不同的动态链接库,常用的一些编程软件均可以编写DLL文件。DLL 不是独立运行的程序,而是某个程序的一个部分,它只能由所属的程序调用,用户不能,也不需要打开它。 LabVIEW调用DLL文件

VB如何调用dll函数

VB如何调用dll函数 2008-01-10 17:17 開始習慣孤單 | 分类:VB| 浏览13089次 假如我有个DLL,名为 asdfg.dll 它里面有一个函数 zxc(参数1,参数2) 我要用这个函数,该怎么写? 请高手帮我写出脚本,有时间的话请再加上注释 谢谢!! 2008-01-10 19:50 提问者采纳 1.在工程-引用中将asdfg.dll引用过来 2.dim AAA as asdfg 'asdfg是类模块的名称 Private Sub Form_Load() dim x Set AAA = New asdfg x = AAA.zxc(参数1,参数2)'参数1,2自己写 End Sub 建议你了解一下下面dll的制作方法,理解就更透彻了。下面内容来自百度。 1.新建一个ActiveX Dll,工程名字为vbmytestdll,类模块

名字为mytestdll 2.类模块内容只有一个函数,主要返回DLL的HELLO WORLD Public Function dlltest1() As String dlltest1 = "HELLO WORLD" End Function 3.保存,生成DLL,名字为 vbmytestdll.dll 4.新建一个EXE工程,在菜单: 工程---引用---浏览里找到vbmytestdll.dll,把它引用进来 5.EXE工程代码如下: Option Explicit Dim testdll As mytestdll'类模块名字 Private Sub Form_Load() Set testdll = New mytestdll 'DLL的一个新实例 Me.Caption = testdll.dlltest1 '我的标题=返回DLL的HELLO WORLD

Winform多窗口或多线程传递数据的方法

前提:假设现在有两个窗口Form1和Form2, Form2是Form1的子窗口,现在需要通过Form2来改变Form1中的内容 效果: 方法一:使用Delegate(代理) 第一步:在Form2中定义代理并声明实例 第二步:在Form1中定义用来代理的函数 第三步:在Form1中生成Form2的实例并将代理赋值给Form2中的代理对象

第四步:在Form2中调用代理 总结:当Form2调用代理对象proEvent时实际上是在调用Form1中的Eventpro函数,由于Eventpro属于Form1,所以赋值成功。 方法二:使用自定义事件 第一步:自定义事件 第二步:在Form2中声明事件对象 第三步:在Form1中定义事件回调函数

第四步:创建Form2的对象实例,并将事件的回调函数添加到事件上(订阅事件) 第五步:在Form2中的按钮上触发事件 总结:当第五步事件被触发,事件对象Events会向所有订阅该事件的函数进行触发,而回调函数EventCallBack是Form1的成员,见第三步,所以数据传递成功。 利弊分析:第一种方法的优点显而易见,代理参数是可以自定义的,如:void EventPro(string Message),其缺点就是,每一个这样的跨窗口调用都需要在子窗口中定义一个代理对象,并在主窗口中赋值相应的函数。相对来说,我偏向于使用自定义事件,首先,不是所有学过winform的人都接触过这部分内容(高端大气上档次),其次,他可以实现一个函数向n个窗口传值,只要给事件添加订阅就可以了,frm.Events += new EventHandler(EventCallBack)。(方便)。另外,看过winform下层代

一步一步教用VC和VB调用C++ DLL

一步一步教你用VC和VB调用C++ DLL 从VC++应用程序调用C++ DLL的函数 Visual Studio 6 使创建包含函数或类的动态连接库(DLL) 变得非常容易.第一步 打开Visual Studio 然后选择File | New菜单项: 选择Win32 Dynamic Link Library, 输入工程名, 敲OK.

选择A DLL that exports some symbols 并单击Finish.在File View里你会看到如下的工程文件: 第二步 在Test.cpp里,你将看到如下代码: // Test.cpp : Defines the entry point for the DLL application.//#include "stdafx.h"#include "Test.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; } // This is an example of an exported variable TEST_API int nTest=0; // This is an example of an exported function. TEST_API int fnTest(void) { return 42; } // This is the constructor of a class that has been exported.// see Test.h for the class definition CTest::CTest() { return; } Test.cpp 包含了fnTest 和 CTest::CTest.如果你现在编译Test.dll, 你将会得到一个可以被其他VC++应用程序直接调用的DLL. 允许其他VC++程序调用的关键机制?( key mechanism)就包含在Test.h中: // The following ifdef block is the standard way of creating macros// which make exporting from a DLL simpler. All files within this DLL// are compiled with the TEST_EXPORTS symbol defined on the command line.// This symbol should not be defined on any project that uses this DLL.// This way any other project whose source files include this file see // TEST_API

11线程池的使用

第11章线程池的使用 第8章讲述了如何使用让线程保持用户方式的机制来实现线程同步的方法。用户方式的同步机制的出色之处在于它的同步速度很快。如果关心线程的运行速度,那么应该了解一下用户方式的同步机制是否适用。 到目前为止,已经知道创建多线程应用程序是非常困难的。需要会面临两个大问题。一个是要对线程的创建和撤消进行管理,另一个是要对线程对资源的访问实施同步。为了对资源访问实施同步,Wi n d o w s提供了许多基本要素来帮助进行操作,如事件、信标、互斥对象和关键代码段等。这些基本要素的使用都非常方便。为了使操作变得更加方便,唯一的方法是让系统能够自动保护共享资源。不幸的是,在Wi n d o w s提供一种让人满意的保护方法之前,我们已经有了一种这样的方法。 在如何对线程的创建和撤消进行管理的问题上,人人都有自己的好主意。近年来,我自己创建了若干不同的线程池实现代码,每个实现代码都进行了很好的调整,以便适应特定环境的需要。M i c r o s o f t公司的Windows 2000提供了一些新的线程池函数,使得线程的创建、撤消和基本管理变得更加容易。这个新的通用线程池并不完全适合每一种环境,但是它常常可以适合你的需要,并且能够节省大量的程序开发时间。 新的线程池函数使你能够执行下列操作: ? 异步调用函数。 ? 按照规定的时间间隔调用函数。 ? 当单个内核对象变为已通知状态时调用函数。 ? 当异步I / O请求完成时调用函数。 为了完成这些操作,线程池由4个独立的部分组成。表11 - 1显示了这些组件并描述了控制其行为特性的规则。 表11-1 线程池的组件及其行为特性

LabVIEW编程调用DLL时遇见的问题

LabVIEW编程调用DLL时遇见的问题 对于使用LabVIEW编程的人来说,都知道LabVIEW功能强大,但也会发现似乎缺少某些功能,而像其他编程语言的DLL、ActiveX组件则能提供。 在使用DLL(动态链接库)时,最大的困难就是把函数参数的数据类型映射为相应的LabVIEW中的数据类型。LabVIEW 提示: 未定义符号可能会造成函数和参数无法被识别。如要解决该问题,检查头文件并确定是否必须添加预定义符号。单击上一步按钮返回至向导的前一页并添加预定义符号(例如,"NIAPI_stdcall = __stdcall"或"NIAPIDefined = 1")在一次进行串口调试软件的编写过程中,要求使用动态链接库(其实使用VISA同样可以实现),使用导入共享库工具以自动生成配置CLN(Call Library Function)节点,工具在“工具—导入—共享库(.dll)”菜单项下,专门用于将DLL 中函数包装成VI。 下一步下一步点击解析头文件后,依然遇见(如下图) extern UINT Recv(UCHAR *pRecvBytes,UINT unRecvLength);(函数原型) 未定义符号可能会造成函数和参数无法被识别。如要解决该问题,检查头文件并确定是否必须添加预定义符号。单击上一步按钮返回至向导的前一页并添加预定义符号(例如,"NIAPI_stdcall = __stdcall"或"NIAPIDefined = 1")

归咎原因就是头文件中的一些类型定义不符合标准C语法,而使解析器无法获得正确的的mPWIN32_COMMAND定义。DLL函数的头文件中可能使用了某个系统定义的数据类型,数据类型的定义在windows.h中,(windows.h是Windows SDK的一个文件,VC等开发环境中常常带有Windows SDK),要正确解析必须得到这些数据类型,也就是找到windows.h 这个头文件,用户须把windows.h文件的全路径加在“包括路径”中。例如Visual C++6.0编译环境中头文件位于安装目录下VC98文件夹下的Include文件中。 而“预处理定义”中,当用户需要写一些宏定义,那么就写在这个位置。 在网络上看到在预处理定义中添加了如下代码 ULONG = unsigned long; VOID = void; LONG = long; UCHAR = unsigned char; PUCHAR = unsigned char*; PULONG = unsigned long*; WINAPI; BOOL = bool; USHORT = unsigned short; PUSHORT = unsigned short*; 点击下一步也不会遇到上述问题,导入工具会帮助你解析出全部导出函数并自动生成VI。

vb编写DLL学习

怎样用VB编写DLL文件??? 你先打开VB,然后先中“ActiveX Dll”工程,然后开始编辑。编完后,保存一般是以“.cls”和“.vbw”保存。这时你选择“文件”菜单,弹出下拉框,选中“生成.dll”选项,它就会在上面弹出一个进度条“正在生成.dll文件”。生成以后是一个有好象齿轮状的图标。 如果你要引用,就开一个“标准EXE”工程,然后在“工程”选项中,单击“引用”,找到你刚才的“.dll”的文件名,在前面的复选框中打勾,就可以引用你刚才在那里面写的方法等。 在vb6里建新工程时选用建立dll 做好后用vb的引用就可以了 VB中创建的DLL只是COM组件,无法作为输出函数的DLL,其实这只是个错误的说法。其实MS 非常狡猾,如果你是个VB疯狂发烧友的话,应该早就狂试出这种可以创建输出函数的DLL的方法。 VB编译文件实际上采取了两次编译的方法,首先是调用C2.exe产生*.OBJ文件,然后调用Link.EXE连接。如果在LINK的时候添加EXPORT选项,实际上是可以输出函数的。但是,在VB的工程选项中将这些屏蔽了。而且过分的是:VB在Build完成后会将OBJ文件删除,这样就无法手动通过Link来创建我们需要的DLL了。不过我找到一个比较龌鹾的变通的方法,就是先创建一个Exe工程,在Form_Load事件里面写下面的语句: Sub Main If MsgBox("哈哈", vbOKCancel) = vbOK Then Shell "link2.exe " & Command$ End If End Sub 然后编译为LinkTemp.EXE,接下来将LINK.EXE改名为Link2.exe,将LinkTemp.EXE改名为Link.EXE。这样在VB调用Link.EXE时会弹出对话框,处理就会中断。这时就可以有机会将OBJ文件拷贝出来了。然后我创建了一个ActiveX DLL工程,在这个工程里面添加一个Module并创建一个Public函数mathadd: Public Function mathadd(ByVal a As Long, ByVal b As Long) As Long mathadd = a + b End Function 编译这个工程,在Link的时候就会中断。然后把创建的Class1.obj、Module1.obj、Project1.obj备份出来。然后就可以调用Link2.exe连接OBJ到DLL了,我的连接代码是: Link2.exe "e:\vbdll\Class1.obj" "e:\vbdll\Module1.obj" "e:\vbdll\Project1.obj" "E:\Program Files\Microsoft Visual Studio\VB98\VBAEXE6.LIB" /ENTRY:__vbaS /EXPORT:mathadd /OUT:"e:\vbdll\ProjectOK.dll" /BASE:0x11000000 /SUBSYSTEM:WINDOWS,4.0 /VERS 注意里面的/ENTRY和/EXPORT开关,/EXPORT开关声明了输出函数mathadd。这样就大功告成了,可以被其他语言引入,例如在VB中,只需要: Private Declare Function mathadd Lib "e:\vbdll\ProjectOK.dll" (ByVal a As Long, ByVal b As Long) As Long

并发危险:解决多线程代码中的 11 个常见的问题

并发危险:解决多线程代码中的11 个常见的问题 并发危险 解决多线程代码中的11 个常见的问题 Joe Duffy 目录 数据争用忘记同步粒度错误读写撕裂无锁定重新排序重新进入死锁锁保护戳记两步舞曲优先级反转实现安全性的模式不变性纯度隔离并发现象无处不在。服 务器端程序长久以来都必须负责处理基本并发编程模型,而随着多核处理器的日益普及,客户端程序也将需要执行一些任务。随着并发操作的不断增加,有关确保安 全的问题也浮现出来。也就是说,在面对大量逻辑并发操作和不断变化的物理硬件并行性程度时,程序必须继续保持同样级别的稳定性和可靠性。 与对应的顺序代码相比,正确设计的并发代码还必须遵循一些额外的规则。对内存的读写以及对共享资源的访问必须使用同步机制进行管制,以防发生冲突。另外,通常有必要对线程进行协调以协同完成某项工作。

这些附加要求所产生的直接结果是,可以从根本上确保线程始终保持一致并且保证其顺利向前推进。同步和协调对时间的依赖性很强,这就导致了它们具有不确定性,难于进行预测和测试。 这 些属性之所以让人觉得有些困难,只是因为人们的思路还未转变过来。没有可供学习的专门 API,也没有可进行复制和粘贴的代码段。实际上的确有一组基础概念需要您学习和适应。很可能随着时间的推移某些语言和库会隐藏一些概念,但如果您现在就 开始执行并发操作,则不会遇到这种情况。本文将介绍需要注意的一些较为常见的挑战,并针对您在软件中如何运用它们给出一些建议。 首先我将讨论在并发程序中经常会出错的一类问题。我把它们称为“安全隐患”,因为它们很容易发现并且后果通常比较严重。这些危险会导致您的程序因崩溃或内存问题而中断。当 从多个线程并发访问数据时会发生数据争用(或竞争条件)。特别是,在一个或多个线程写入一段数据的同时,如果有一个或多个线程也在读取这段数据,则会发生 这种情况。之所以会出现这种问题,是因为Windows 程序(如C++ 和Microsoft .NET Framework

在VB中调用DLL的方法

1制作好DLL之后,就可以用VB调用它,实现VB调用C程序。VB程序要使用DLL中的函数,首先必须要有特殊的声明,用Declare声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。 语句格式为:Declare Sub过程名Lib[Alias"别名]([ByVal参数AS类型]),或为Declare Function函数名Lib[Alias"别名]([ByVal参数AS类型])AS类型在声明中首先用Declare 关键字表示声明DLL中的函数。在C语言中有的函数类型为VOID,它表示不具有返回值,则必须用关键字Sub将其声明成过程。有的函数具有返回值,则必须用关键字Function将其声明成函数,并且在声明语句的最后要用AS关键字指明函数返回值的类型。 例如上面的ADD.DLL在VB中就可以声明为: Declare Function ADD Lib“c:\ADD.dll”(ByVal X AS Integer,ByVal Y AS Integer,ByVal filein asstring)AS Integer 通过此声明语句将函数ADD声明到VB中,便可直接调用。 2、dll文件中的函数好像是C语言写的, //函数名:int__stdcall GetMacNo(int*MacNo) //功能:获取卡机的卡机号(单机时) //参数:MacNo[0]-被读出的卡机号 //返回值:0-成功, //2-PC接收超时, //3-应答错误 dll的文件名是COMM232.dll 函数的形参int*MacNo是指针吗? 在VB中应该怎么声明和调用该函数? VB里也可以定义指针吗? 问题补充:vb调用dll文件中的函数我是会的,但这儿的形参有一个星号才不知是怎么一回事, 我是这样声明的对吗? Public Declare Function GetMacNo Lib"COMM232.dll"(ByVal MacNo As Integer)As Integer 又应该怎么调用呢?要先定义一个指针的变量再传给*MacNo还是要怎么做? 都说了MacNo是被读出的卡机号,那么就是传址的了。 dim l as integer dim m as integer l=GetMacNo(m) if l=0then label1.caption="卡机号:"&m elseif l=2then msgbox"PC接收超时" elseif l=3then msgbox"应答错误" end if

相关主题