VC 编DLL的函数说明:
  // vc void __stdcall AppSourceAtSubjectStructureSourceTailSep(CSubject* lpSubject ,LPCTSTR lpszTip,DWORD dwSourceType,DWORD dwContent,DWORD dwContentLen,DWORD dwFormat,BOOL bSilent,BOOL bSynchronous);VB中的DLL函数声明代码如下:
Public Declare Function AppSourceAtSubjectStructureSourceTailStr Lib "c:\WINNT\system\Linker.Dll" (ByVal lSubjectId As Long, ByVal lpszTip As String, ByVal dwSourceType As Long, ByVal lpszText As String, ByVal dwContentLen As Long, ByVal dwFormat As Long, ByVal bSilent As Long, ByVal bSynchronous As Long)VB中的DLL的函数调用代码如下:
AppSourceAtSubjectStructureSourceTailStr lSubjectId, LPCTSTR, dwSourceType, lpszText, dwContentLen, dwFormat, bSilent, bSynchronous
想问问题如下:
编译运行时错误提示:实时错误 '49"
DLL调用约定错误.请各位高手帮小弟查出错误的原因和解决方法!
小弟在此谢过!

解决方案 »

  1.   

    Public Declare Function AppSourceAtSubjectStructureSourceTailStr Lib "c:\WINNT\system\Linker.Dll" (ByVal lSubjectId As Long, ByVal lpszTip As String, ByVal dwSourceType As Long, ByVal lpszText As String, ByVal dwContentLen As Long, ByVal dwFormat As Long, ByVal bSilent As Long, ByVal bSynchronous As Long) as long
      

  2.   

    可是我的函数并没有返回值,C++的函数返回为void
      

  3.   

    楼上的,给个解释嘛,多谢vc的Void 是不关心返回值,但是函数始终会给个返回地址,不管有效无效。所以声明称 as long 似乎有道理,现在问的是,VB中函数有返回值跟无返回值的区别
      

  4.   

    没有返回值,你就把最后的As Long去掉就可以了啊!还有啊,你的C++组件里面用了自己的类和结构定义。你要先在VB里面把它改成VB的定义方式描述一下。如:
    '类中特有的数据类型
    'enum KLWM_RTN_VAL {
    '    KLWMERR_SUCCESS = 1,
    '    KLWMERR_SRC_FILE_NOT_FOUND = 1010,
    '    KLWMERR_SRC_IMG_TYPE = 1020,
    '    KLWMERR_TGT_IMG_TYPE = 1030,
    '    KLWMERR_WM_FILE_NOT_FOUND = 1040,
    '    KLWMERR_WM_IMG_TYPE = 1050,
    '    KLWMERR_CONVERT = 1060,
    '    KLWMERR_TIMEOUT = 1070,
    '    KLWMERR_OTHER = 9000,
    '};
    '
    'enum KLWM_FILE_TYPE {
    '    KLWMFT_BMP,
    '    KLWMFT_GIF,
    '    KLWMFT_JPEG,
    '    KLWMFT_JPG = KLWMFT_JPEG,
    '    KLWMFT_TIFF,
    '    KLWMFT_TIF = KLWMFT_TIFF,
    '    KLWMFT_DIB,
    '    KLWMFT_PDF,
    '    KLWMFT_EPS,
    '    KLWMFT_PCX,
    '    KLWMFT_PNG,
    '    KLWMFT_PSD,
    '    KLWMFT_TGA,
    '};
    '转到VB中的样式写法
    Enum KLWM_RTN_VAL
        KLWMERR_SUCCESS = 1
        KLWMERR_SRC_FILE_NOT_FOUND = 1010
        KLWMERR_SRC_IMG_TYPE = 1020
        KLWMERR_TGT_IMG_TYPE = 1030
        KLWMERR_WM_FILE_NOT_FOUND = 1040
        KLWMERR_WM_IMG_TYPE = 1050
        KLWMERR_CONVERT = 1060
        KLWMERR_TIMEOUT = 1070
        KLWMERR_OTHER = 9000
    End Enum
    Enum KLWM_FILE_TYPE
        KLWMFT_BMP
        KLWMFT_GIF
        KLWMFT_JPEG
        KLWMFT_JPG = KLWMFT_JPEG
        KLWMFT_TIFF
        KLWMFT_TIF = KLWMFT_TIFF
        KLWMFT_DIB
        KLWMFT_PDF
        KLWMFT_EPS
        KLWMFT_PCX
        KLWMFT_PNG
        KLWMFT_PSD
        KLWMFT_TGA
    End Enum
      

  5.   

    我把那个as long 加进去的时候就可以保存在函数里面,但是打包的时候就错.
      

  6.   

    在VB应用程序中调用VC环境下开发的DLL   1. 调用DLL的优越性
      动态链接库(DLL)作为Windows操作系统的基础,具有优越的应用性能:
      DLL扩展了应用程序的特性。由于DLL能够动态地装入进程的地址空间,因此应用程序能够在运行时确定需要执行什么操作,然后装入相应的代码,以便根据需要执行这些操作。
      DLL可以用多种语言进行编写。例如用VB来编写应用程序的界面,而用C++来编写诸如算法、通讯之类的底层操作。
      DLL简化了软件项目的管理。如果在软件开发过程中不同的工作小组在不同的模块上工作,那么这个项目管理起来比较容易。
      DLL有助于节省内存。如果两个或多个应用程序使用同一个DLL,那么该DLL的页面只要放入RAM一次,所有的应用程序都可以共享它的各个页面。
      DLL有助于资源的共享。DLL可以包含对话框模板、字符串、图标和位图等资源,多个应用程序能够使用DLL来共享这些资源。
      DLL有助于应用程序的本地化。例如,只包含代码而不包含用户界面组件的应用程序可以加载包含本地化用户界面组件的DLL 。
      DLL有助于解决平台差异。不同版本的Windows配有不同的函数,开发人员常常想要调用新的函数。但是,如果源代码包含了对一个新函数的调用,而应用程序将要在不能提供该函数的Windows版本上运行,那么操作系统的加载程序将拒绝运行该进程。如果将这些新函数保存在DLL中,那么应用程序就能够将它们加载到Windows的老版本上,就可以成功地调用该函数。2.找到DLL的入口点
      初次接触DLL的用户经常会遇到一个问题:在VC环境下创建的DLL,在VC里运行的好好的,可在VB应用程序中调用时却老是出现"调用约定错误"、"找不到入口点"之类的错误。这主要是由以下疏漏造成的。
      首先,要注意DLL中的函数和VB中的函数声明在名称、返回类型、参数类型、参数个数等方面必须完全相同,尤其要注意大小写的问题。
      其次,在DLL的.def文件中必须加上入口函数。
      最后,在函数定义前必须加上extern "c",_stdcall关键字。
      具体格式可参看应用实例。 
    3.数组参数在DLL中的传递
      由于DLL经常用来进行一些底层的运算操作,因此应用程序常需要传递大量的数据给DLL。在C++中,指针是进行数组操作的最佳选择,但VB中没有指针的概念。这通常可用两种方法来解决。
      其一,在VB中声明DLL时,用byref来代替byval,即可将数组指针传递给DLL。
      另外,将数组声明为变体型(variant),即可直接将数组传递给DLL。
    4.应用实例
      以下通过一具体实例来说明在VB中调用VC环境下创建的DLL的过程。
      创建一用于信号处理的DLL,"SigPro.dll",其中有一个用于富氏计算的函数"Fourier"。VC中的声明:
    在"SigPro.h"中加入以下代码,
    extern "C"
    {
    double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos);
    }
    在"SigPro.cpp"中加入以下代码,
    extern "C"
    double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos)
    {
    int i;
    double result=0.0; if(SinOrCos==true)
    {
    for(i=0;i<NumSam;i++)
    {
    result=result+*(Sample+i)*cos(OvertoneOrder*i*2*3.1415926/NumSam);
    }
    }
    else
    {
    for(i=0;i<NumSam;i++)
    {
    result=result+*(Sample+i)*sin(OvertoneOrder*i*2*3.1415926/NumSam);
    }
    }
    result =result*2/NumSam;
    return result;
    }
    在"SigPro.def"中加入以下代码,
      EXPORTS
      Fourier
    VB中的调用声明:
      Public Declare Function Fourier Lib "SigPro" (ByRef Sample() As Long, ByVal NumSam As Integer, ByVal OvertoneOrder As Integer, ByVal SinOrCos As Boolean) As Double
      

  7.   

    我是把我所要的文件存在函数里,然后就打包就出错,出错信息以下:
    "0x03f514cd"指令引用的"0x00000000"内存该现存不能为"read".
    要终止程序,请单击确定".
    要调试程序, 请单击"取消"