1.老师提供的DLL参数:extern "C" __declspec(dllimport) int CalculDate(char * ciqCode,char * registerString,char * opendateBuff);
extern "C" __declspec(dllimport) int CalculRegister(char * ciqCode,char * registerStringbuff,char * opendate);
ciqCode:20字符长度 registerString*:30字符长度 opendate*:10字符长度
2.我个人加入的说明:    有一用C语言写的rkjob.DLL,已知其函数、参数为   (注意是指针)
int CalculRegister(char * ciqCode,char * registerStringbuff,char * opendate);[目的]
    用VB编程分配三个空间,从Text1、Text3输入字符串给DLL中的函数,DLL自动计算后将值写入了空间2中,这时只要读取空间2的地址的内容到Text3中。
    此DLL用于先输入CIPCODE和注册日期,再通过算法得到某个程序的“注册码”。
[问题]
    怎样用VB访问地址?    高手,我可以将DLL及参数说明发给您,期待您的解答。能否写一小小例程?

解决方案 »

  1.   

    求救!!!各路大侠!!!
    版主!!!你也可以用delphi来实现!
    只要实现,码上给分!!
      

  2.   

    我想看看可以么?
    [email protected]
      

  3.   

    1.如何在内存中的指定位置取数据?Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _ 
    (Destination As Any, Source As Any, ByVal Length As Long) 
    'lpt 已知的内存地址 
    'size 欲读取的内存大小 
    '注:copymemory调用的方式为过程调用,不能有返回值 
    'copymemory传递source本身是按地址传递,但此处要按值传递指针(欺骗vb,vb仍然认为传递的是地址) '代码: Function Getvalue(lpt As Long, size As Long) 
    Dim x '用于读出的结果存放变量 
    CopyMemory x, ByVal lpt, ByVal size 
    Getvalue = x 
    End Sub 
    2.VarPtr、StrPtr和ObjPtr函数的用法 在Basic语言演变成QBasic,然后到Visual Basic之前,VarPtr函数就已经存在了。开始,这个函数存在于VB运行库1.0版中。通过声明可以调用这个函数: Declare Function VarPtr Lib "vbrun100.dll" (Var As Any) As Long 数年之后,vbrun100.dll变成了msvbvm50.dll,但该函数的入口点却还在那儿。为了获取变量的地址,只须将变量名传递给该函数就行了。例如: Dim l As Long 
    Debug.Print VarPtr(l) 类似地,为了获取字符串的指针,而非保存字符串的变量的指针,只须在变量名前加上ByVal即可。如: Debug.Print VarPtr(s),VarPtr(ByVal s) 在VB3之前,用这种方法来获取字符串缓冲的指针是非常普遍的。但在VB4却遇到了一点麻烦。 ANSI/UNIDCODE问题 随着32位世界和VB4的到来,我们迈进了一半是UNICODE,一半是ANSI的Windows世界。而在此之前,是ANSI一统天下。在VB中,所有字符串按UNICODE保存,但所有的API调用却仍使用ANSI字符串。这就要求在调用API函数之前,将字符串从UNICODE转换成ANSI,函数执行结束后,将返回的字符串从ANSI转换成UNICODE。虽然大多数时候这种转换对用户来说是透明的,但这就使利我们不能将一个字符串类型的参数以UNICODE方式从VB传递给DLL。类似地,任何包含有字符串的结构在执行API调用时,也必须经过这种双重转换。 这种差异是如何影响VarPtr函数的呢?当一个字符串传递给VarPtr函数时,函数执行后所返回的地址是保存临时ANSI字符串的临时ANSI字符串或变量的地址。换句话说,这个地址并不是你声明的变量的真正地址。因此,对于字符串变量以及包括字符串的结构来讲,这个函数一点用也没有。 VB5来解决问题 为了能VarPtr能重新发挥作用,VB5(及Office97)加入了三个针对VBA类型库的入口点。这些入口点为VarPtr函数提供了内置的声明。这三个函数的作用是: VarPtr:返回变量地址 StrPtr:返回真正的UNICODE字符串缓冲区的地址 ObjPtr:返回任何对象变量引用的地址 下面是这三个函数的具体用法。 StrPtr 该函数主要用来产生高效的UNICODE API调用。在VB4,UNICODE形式的API函数的调用必须借助于Byte数组,例如: Declare Sub MyUnicodeCall Lib "MyUnicodeDll.dll" (pStr as Byte) Sub MakeCall (MyStr as String) Dim bTmp() as Byte 
    bTmp=MyStr & vbNullChar 
    MyUnicodeCall bTmp(0) 
    MyStr=bTmp 
    MyStr=left(MyStr, Len(MyStr)-1) End Sub 如果使用StrPtr,上面的代码精简为: Declare Sub MyUnicodeCall Lib "MyUnicodeDll.dll" (pStr as Byte) Sub MakeCall (MyStr as String) MyUnicodeCall StrPtr(MyStr) End Sub VarPtr/StrPtr/ObjPtr的执行速度非常非常快,因此调用UNICODE函数所赞成有系统负担实际上小于调用相对应的ANSI函数。因为前者不需进行转换。 StrPtr还能用于优化ANSI API函数的调用。在调用时使用StrConv和StrPtr就能避免将一个字符串变量多资传递给函数以及为每个调用而执行转换操作所造成的系统负担。例如原来的: Declare Sub MyAnsiCall Lib "MyAnsiDll.dll" (ByVal pStr As String) MyAnsiCall MyStr 现在变为: Declare Sub MyAnsiCall Lib "MyAnsiDll.dll" (ByVal pStr As Long) MyStr=StrConv(MyStr,vbFromUnicode) 
    MyAnsiCall StrPtr(MyStr) 
    MyStr=StrConv(MyStr,vbUnicode) '并不总是要求 StrPtr还是唯一能直观地告诉你空字符串和null字符串的不同的方法。对于null字符串(vbNullString),StrPtr的返回值为0,而对于空字符串,函数的返回值为非零。 VarPtr 该函数能与要求包含有UNICODE字符串的结构的API调用一起使用。如果将一个MyUDTVariable变量(一个自定义类型的变量)传递给一个由ByRef UDTParam As MyUDT定义的参数,就会发生ANSI/UNICODE之间的转换。但是,如果将VarPtr(MyUDTVariable)传递给由ByVal UDTParam As Long定义的参数,则不会发生这样的转换。 有一点需要特别注意,在VB中指针的算法非常重要。此外,你必须计算元素的大小,因为VB不会帮你完成这项工作。你还必须处理缺乏无符号长整型数据类型的问题。下面的函数实现了无符号算法 Function UnsingedAdd (ByVal Start As Long, ByVal Incr As Long) As Long Const SignBit As Long = &H80000000 
    UnsignedAdd=(Start Xor SignBit) + Incr Xor SignBit End Function ObjPtr 该函数返回由对象变量引用的接口指针。由于大多数对象都支持多重接口,因此搞清楚地址对应的是对象的哪一个接口就非常重要了。通常个函数用来放在集合中的对象。通过创建基于对象地址的关键字,你就可以在不需要启遍历整个集合中所有元素的情况下,轻松地将对象从集合中删除。在许多情况下,对象地址是唯一可靠的能作为关键字的东西,示例如下: ObjCol.Add MyObj1,CStr(ObjPtr(MyObj1)) ..... ObjCol.Remove CStr(ObjPtr(MyObj1)) 
      

  4.   

    各位高手,这种问题在DELPHI中如何来实现呢??
    请帮帮忙!!