首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

关于VB中 异常代码为48的 有关问题

2013-09-24 
求助关于VB中 错误代码为48的 问题大家好,我在工作中遇到了一个VB程序开发的问题,现将问题描述如下,希望能

求助 关于VB中 错误代码为48的 问题
大家好,我在工作中遇到了一个VB程序开发的问题,现将问题描述如下,希望能在咱们论坛里面找到高手点拨我一二,或提供解决问题的思路:
开发的这个程序主要是一套加载系统的控制软件,通过这个软件实现试验数据的采集和加载系统的控制,前者是通过外围的PCI板卡实现的,而加载系统的控制主要是通过一款USB的波形发生器生成脉冲波实现,这两中控制均有厂家提供的DLL动态链接库。也就是说,这款软件主要是实现两个目的:第一,通过DLL提供的函数来生成所需要的脉冲,第二,通过DLL提供的函数来控制数据采集卡来实现数据采集。
我在程序的标准模块中声明了程序所使用的函数,并且声明了DLL所在的位置路径,并保证在指定的路径下DLL文件存在。(这样就避免了因为找不到DLL文件而出现错误)
在程序中我定义了DLL文件所规定的变量,并保证变量的类型正确;
可是在调试程序的过程中,波形发生器的控制函数位置却提示有“实时错误:48”即 DLL未能成功载入的错误,为了测试DLL文件是否有效,我编了一个简易的程序来测试波形发生器的DLL,结果没有出现48的错误,并成功运行了。
现在比较纠结的无法确定程序的问题所在?
附:
波形发生器的DLL函数解释(仅供交流):

DDS-3005 USB SDK manual
DDS-3005 USB offers the agile interface of second time development for users, and offers examples for many languages and the editor .Users can use the functions interface in DDSCON.DLL to implement all functions of DDS-3005 USB, and to be inserted into other auto-measuring systems.
Let’s explain every function interface using VC. Interface of any language implement complete same functions. It’s used to reference. The declaration of interface can reference second time development that our company offers for you. Users pay attention to the questions of the variable type and address’s transfer. 
1 Control memory setting
设置波形发生器控制参数
//Optional parameters
可选参数
第零位(bit0)为控制循环模式
#define SINGLE_WAVE   0x01   //Single waveform  单次模式
0x01代表十进制1,转换成二进制为0000 0001,亦即代表第零位为1时,为单次模式
#define CONSTANT_WAVE   0x00   //Constant waveform  循环模式
0x00代表十进制0,转换成二进制为0000 0000,亦即代表第零位为0时,为循环模式
第一位(bit1)控制外部触发还是内部触发

#define EXT_RAISING_TRIG   0x02   //External raising trigger 外触发,上升沿
0x02代表十进制2,转换成二进制为0000 0010,亦即代表第一位为1时,为外部触发,上升沿

#define EXT_FALLING_TRIG   0x00   //External falling trigger外触发,下降沿
0x00代表十进制0,转换成二进制为0000 0000,亦即代表第一位为0时,为外部触发,下降沿

#define EXT_TRIG_EN   0x04   //External trigger 外触发使能
0x04代表十进制4,转换成二进制为0000 0100,亦即代表第二位为1时,为外部触发
#define INT_TRIG_EN   0x00   //Intramural trigger 内触发使能
0x00代表十进制0,转换成二进制为0000 0000,亦即代表第二位为0时,为内部触发

第三位(bit3)预留

第四位(bit4)控制外部触发还是内部触发

#deine STOP_OUTPUT   0x10   //Stop output 停止输出(在一个波结束时停止)


0x10代表十进制16,转换成二进制为0001 0000,亦即代表第四位为1时,为停止输出

#define START_OUTPUT   0x00   // Start output 启动输出 (在一个波开始时启动)
0x00代表十进制0,转换成二进制为0000 0000,亦即代表第四位为0时,为开始输出波形

第五位(bit5)预留

第六位(bit6)控制是否设置锁存器
#define COUT_NOT LATCH   0x40   //Output latch(门闩?)
0x40代表十进制64( ),转换成二进制为0100 0000,亦即代表第六位为1时,为计数器状态
#define COUT_LATCH   0x00   //F
0x00代表十进制0,转换成二进制为0000 0000,亦即代表第六位为0时,为计数器状态

第七位(bit7)控制工作状态

#define COUNTER   0x80   //Counter state 计数器状态
0x80代表十进制128( ),转换成二进制为1000 0000,亦即代表第七位为1时,为计数器状态

#define FRQ_TEST   0x00   //Frequency test state 频率检测状态
0x00代表十进制0,转换成二进制为0000 0000,亦即代表第七位为0时,为频率检测状态


__declspec(dllimport) BOOL WINAPI SetCON(unsigned char d int, index);

Parameters introduction:
d :unsigned 8 bits integer
d为8位无符号整形数据,即d由所设置的状态进行位或计算
Index :device number to operate
index为欲操作设备号
Return value:If return true, it express successful setup, else  express failing setup.
如果返回值为TRUE,则表示设置成功,否则表示设置失败
Example:BOOL Flag;
BOOL  是函数返回类型,一般说明函数 调用是否成功等判断的;
WINAPI 说明该函数是标准的C语言调用方式,为统一不同编译器的命名规则。
      Flag=SetCON(CONSTANT_WAVE|
                   EXT_FALLING_TRIG|
                   INT_TRIG_EN|
                   FRQ_TEST|
                   COUT_NOT LATCH,0);
|为VC中的位操作运算符,参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。

Note:The hardware of signal controls the state of signal set by 8 bits control memory(Bit7 to Bit0).
信号源硬件是通过内存中的8位(Bit7至Bit0)数据控制输出信号状态的
Bit0:
第0位:
If return 1, it express output waveform is single waveform,The trigger touch off one single waveform every time. If isn’t single, the voltage will hold the state of last sample.
如果返回值为1,则表示输出波形为单次输出模式,这一“开关”每次触发产生单个波形。如果不是单个波形,电压值将会保持在最后一个样本的状态。
If return 0, it express output continuous. If be touched off (From inside or exterior), it will output periodic waveform hour after hour.


如果返回值为0,则表示为持续输出状态,如果触发波形发生器后(无论是内触发还是外触发),其将持续不地输出周期波形。
综上:八位2进制数的第0位即为单次波形或循环波形的控制开关。
Bit1:
第1位:
If return 1, it express to appear raising trigger.
如果返回值为1,则表示出现上升沿触发
If return 0, it express to appear falling trigger.
如果返回值为0,则表示出现下降沿触发
综上:八位2进制数的第1位可以用来控制是上升沿触发还是下降沿触发。

Bit2:
第2位
If return 1, it express to external trigger work.
如果返还值为1,则表示外部触发工作模式
If return 0, it express to intramural trigger work.
如果返还值为0,则表示内部触发工作模式
综上:八位2进制数的第2位可以用来选择内触发还是外部触发工作模式。

Bit3:hold ?
第3位:预留
Bit4:
第4位
If return 0, it express to start wave output.
如果返回值为0,则表示开始产生波形
If return 1, it express to stop waveform output and wait for trigger.
如果返回值为1,则表示停止生成波形,并等待下次触发
综上:八位2进制数的第4位可以用来控制产生或停止波形的生成。

Bit5:hold ?
第5位:预留

Bit6:
第6位:
If return 0, it express to frequency counter’s output latch then counter signal.
如果返回值为0,则表示频率计数器输出(数值)锁存并且开始对信号进行计数(这个翻译有待验证?)
If return 0, it express to connect directly. If the counter works, it should first be latch then read, last latch.
如果返回值为0(根据上文的参数定义,推测此处应该为1),则表示直接连接,如果计频率计数器继续工作,计数器首先锁存,然后再读取数据,最后再次锁存(这部分翻译有待验证?)
综上:八位2进制数的第6位可以用来控制频率计数器的工作模式(这部分翻译有待验证?)

Bit7:
第7位
If return 0, it express state that the frequency test, reset frequency counter.
如果返回值为0,则表示频率测试的状态,并且重置频率计数器。
If return 1, it express the counter works , being not effected by  intramural gating signal.
如果返回值为1,则表示频率计数器工作,未被内部的门(界限)信号所影响。
综上:八位2进制数的第7位可以用来控制频率计数器的工作模式(这部分翻译有待验证?)

2 8 bits digital I/O control
二、八位数字I/O控制
__declspec(dllimport) BOOL WINAPI DigitalInOut(unsigned char d,unsigned char *o,int  index);

Parameters:d: 8 bits unsigned integer,express 8 bits output I/O
d为8位无符号整型变量,表示8位的I/O输出
Index: device number to operate
Index为待操作的设备号
 Value:
          O point to 8 bits unsigned integer pointer, saving the 8 bits I/O result to the address. 

Return value:If return true ,it express successful operation,else express failing operation.


Example:BOOL Flag;
          Unsigned char OutVal=0xaa;
          Unsigned char InVal;
          Flag= DigitalInOut(OutVal,&InVal,0);

3 Set frequency of output sample point
设置D/A时钟(即设置数字量转换成模拟量时,输出样本点的频率)
__declspec(dllimport) BOOL WINAPI SetAD9850(unsigned long d,int index);
Parameters:d :unsigned long integer.
d为无符号长整型变量
Index: device number to operate
Index为待操作的设备号

Return value:If return true ,it express successful operation,else express failing operation.
如果返回值为TRUE,则表示成功进行了操作,否则操作失败
Example:BOOL Flag;
          Unsigned Long FrqVal=10000;
//定义无符号长整型变量FrqVal=10000
          Flag= SetAD9850 (FrqVal ,0);
//调用SetAD9850函数
Note: Set out frequency of sample point is F, d is 32 bits parameter, then:、
 F是D/A转换的频率,F的倒数是相邻两点之间的时间间隔。
设置样本点的输出频率为F,即单位时间内输出的样本点的个数,1/F表示输出每个样本点所需要的时间,也即相邻两点之间的时间间隔。通过下式反算d。
      F=100 * d / 4294967296  (MHz)
计算d
程序开发 测试 48 DLL 载入错误
[解决办法]

引用:
MSDN上找不到编号为48的错误

加载 DLL 时的错误(错误 48)
   

动态链接库 (DLL) 就是在 Declare 语句的 Lib 子句中所指定的库。此错误有以下的原因和解决方法: 

此文件并非可执行的 DLL。 
如果此文件是正文源文件,它必须编译并链接成可执行的 DLL 形式。

此文件并非 Microsoft Windows DLL。 
取得此文件相应的 Microsoft Windows DLL 版。

此文件是早期的 Microsoft Windows DLL,而且和 Microsoft Windows 保护方式不兼容。 
取得更新的版本。

此 DLL 引用到其他不存在的 DLL。 
取得此被引用的 DLL 并让它能提供其他 DLL 使用。

此 DLL 或所引用的 DLL 并不在所指定的目录中。 


移动 DLL 到所引用的目录或将 DLL 所在的目录添加到路径中。

详细信息,可选取有问题的项目,并按下 F1 键。 

[解决办法]
Error in loading DLL (Error 48)

A dynamic link library (DLL) is a library specified in the Lib clause of a Declare statement. This error has the following causes and solutions: 

? The file isn't DLL-executable. 
If the file is a source-text file, it must be compiled and linked to DLL executable form.

? The file isn't a Microsoft Windows DLL. 
Obtain the Microsoft Windows DLL equivalent of the file.

? The file is an early Microsoft Windows DLL that is incompatible with Microsoft Windows protect mode. 
Obtain an updated version of the DLL.

? The DLL references another DLL that isn't present. 
Obtain the referenced DLL and make it available to the other DLL.

? The DLL or one of the referenced DLLs isn't in a directory specified by your path. 
Move the DLL to a referenced directory or place its current directory on the path.

热点排行