VB调用DLL文件中的函数,有些函数提示找不到入口点,有些却可以成功,是什么原因?

时间:2021-12-08 19:14:16
错误提示为:
“实时错误‘453’
找不到DLL入口点,MP4_ClientStartup(UINT nMessage,HWND hWnd);in hikclient.h”
而调用MP4_ClientSetNetPort函数时未报错

该头文件在VC中可正常使用。

以下是hikclient.h的全部内容:

enum{UDPMODE=0,TCPMODE,MULTIMODE,DIALING};//网络连接方式

enum{NORMALMODE=0,OVERLAYMODE};//显示模式

#define SUPPORT_DDRAW 1 //支持DIRECTDRAW;
#define SUPPORT_BLT         2 //显卡支持BLT操作;
#define SUPPORT_BLTFOURCC   4 //显卡BLT支持颜色转换;
#define SUPPORT_BLTSHRINKX  8 //显卡BLT支持X轴缩小;
#define SUPPORT_BLTSHRINKY  16 //显卡BLT支持Y轴缩小;
#define SUPPORT_BLTSTRETCHX 32 //显卡BLT支持X轴放大;
#define SUPPORT_BLTSTRETCHY 64 //显卡BLT支持Y轴放大;
#define SUPPORT_CPU         128 //CPU不支持;


#define T_UYVY 1
#define T_YV12 3
#define T_RGB32 7


typedef struct{
BYTE    m_bRemoteChannel;//监控的通道
BYTE    m_bSendMode;//联接模式
BYTE    m_bRight;//权限——保留接口
char    *m_sIPAddress;//服务端的IP
char    *m_sUserName;
char    *m_sUserPassword;
BOOL    m_bUserCheck;
HWND    m_hShowVideo;
}CLIENT_VIDEOINFO, *PCLIENT_VIDEOINFO;


#define  CPLAYER_API extern"C" __declspec(dllimport)

#define RECDATAERR 0 //接收数据异常
#define PLAYERR 1//播放异常
#define REFUSED 2//访问服务器被拒绝
#define VERSIONERR 3//服务器的编码器版本和客户端的解码器版本不匹配,收到数据,但是无法播放
#define PLAYERBUSY 4//CPU太繁忙,解码出现丟帧的情况
#define GETSTRING 10//收到ServerStringToClient发送过来的字符串


CPLAYER_API LONG  __stdcall MP4_ClientStart(PCLIENT_VIDEOINFO pClientinfo,void(CALLBACK *ReadDataCallBack)(DWORD nPort,UCHAR *pPacketBuffer,DWORD nPacketSize));
CPLAYER_API BOOL  __stdcall MP4_ClientStop(LONG StockHandle);
CPLAYER_API LONG  __stdcall MP4_ClientGetState(LONG StockHandle);
CPLAYER_API BOOL  __stdcall MP4_ClientStopCapture(LONG StockHandle);
CPLAYER_API BOOL  __stdcall MP4_ClientStartCapture(LONG StockHandle);
CPLAYER_API BOOL  __stdcall MP4_ClientStartCaptureFile(LONG StockHandle,LPTSTR FileName);
CPLAYER_API WORD  __stdcall MP4_ClientGetServerChanNum(LPCTSTR m_sIPAddress);
CPLAYER_API BOOL  __stdcall MP4_ClientCommandtoServer(LPCTSTR m_lAddrIP,char *m_sCommand,WORD m_wLen);
CPLAYER_API BOOL  __stdcall MP4_ClientCommandtoServer_Handle(LONG StockHandle,char *m_sCommand,WORD m_wLen);

CPLAYER_API BOOL  __stdcall MP4_ClientStartup(UINT nMessage,HWND hWnd);
CPLAYER_API BOOL  __stdcall MP4_ClientCleanup();
CPLAYER_API BOOL  __stdcall MP4_ClientShut(LPCTSTR m_lAddrIP,char cChannel);
CPLAYER_API void  __stdcall MP4_ClientReadLastMessage(char *m_sIP,char *m_sCommand,WORD *m_wLen);
CPLAYER_API BOOL  __stdcall MP4_ClientAudioVolume(WORD wVolume);
CPLAYER_API BOOL  __stdcall MP4_ClientAudioStart(LONG StockHandle);
CPLAYER_API BOOL  __stdcall MP4_ClientAudioStop();
CPLAYER_API int   __stdcall MP4_ClientIsSupport();
CPLAYER_API BOOL  __stdcall MP4_ClientSetBufferNum(LONG StockHandle,WORD wBufNum);
CPLAYER_API BOOL  __stdcall MP4_ClientSetNetPort(WORD dServerPort,WORD dClientPort);

//2.0版本增加
CPLAYER_API BOOL  __stdcall MP4_ClientSetTTL(unsigned char cTTLVal);

//2.4版本增加
//设置接收DelayLen K 数据后开始播放(DelayLen:0-600)
CPLAYER_API BOOL  __stdcall MP4_ClientSetPlayDelay(LONG StockHandle,WORD DelayLen);
//设置连接等待时间,dEachWaitTime表示每次连接的等待时间(单位:毫秒)300-10000,默认2000,dTrynum表示尝试连接的次数(单位:次)1-50,默认2
CPLAYER_API BOOL  __stdcall MP4_ClientSetWait(DWORD dEachWaitTime,DWORD dTrynum);
CPLAYER_API BOOL  __stdcall MP4_ClientSetShowMode(DWORD dShowType,COLORREF colorKey);
CPLAYER_API BOOL  __stdcall MP4_ClientSetQuality(LONG StockHandle,WORD wPicQuality);



CPLAYER_API BOOL __stdcall MP4_ClientSetCapPicCallBack(LONG StockHandle,void (CALLBACK* CapPicFun)(long StockHandle,char * pBuf,long nSize,long nWidth,long nHeight,long nStamp,long nType,long nReceaved));
CPLAYER_API BOOL __stdcall MP4_ClientSavePicFile(char * pBuf,long nSize,long nWidth,long nHeight,long nType,char *sFileName);


CPLAYER_API BOOL  __stdcall MP4_ClientThrowBFrame(LONG StockHandle,DWORD dNum);

//2.5版本增加
CPLAYER_API DWORD  __stdcall MP4_ClientGetSdkVersion();
CPLAYER_API DWORD  __stdcall MP4_ClientGetFrameNum(LONG StockHandle);

10 个解决方案

#1


不明白,即然在VC下能运行通过,那么在VB里就可以调用的!

#2


所有的CPLAYER_API改成 extern "C" CPLAYER_API
extern "C"表示可以使其他编程语言访问你编写的DLL中的函数

#3


还有一点,最好这样:
把你要export的函数写在def中。

#4


#define  CPLAYER_API extern"C" __declspec(dllimport)
定义宏CPLAYER_API时,本身就包含了extern "C"了,为什么还要再加上extern "C"?

#5


I think you should export the function to VB application. for example:
#define CPLAYER_API extern "C" __declspec(dllexport) and you should define a .def file to export the function name.

you may try it :-)

#6


#define  CPLAYER_API extern"C" __declspec(dllimport)
把extern"C"去掉试一试,

#7


这个问题只能使用DEF文件来解决,我遇到过这样的问题.VB就只能这样子了.

#8


同意楼上的,不知道为什么dllexport跟.DEF文件定义的就是不一样。

我的程序也是只有用.DEF定义的出口才有效,不知道为什么?

还有:
#define  CPLAYER_API extern"C" __declspec(dllimport)
应当是:
#define  CPLAYER_API extern"C" __declspec(dllexport)
吧!

#9


如果像你们说的那样,应该所有的函数都不能用,可是在调用
MP4_ClientSetNetPort(WORD dServerPort,WORD dClientPort);
的时候没有报错。

#10


vb对dll 的要求比较严格, 用__declspec(dllexport) 申明的函数能够被调用,但是出现调用约定错误, 用 __export WINAPI 申明就可以了. 在vc6里面默认的环境__export WINAPI是个warning ,不能生成dll 文件. 但是在bcb 里面却一切正常.

#1


不明白,即然在VC下能运行通过,那么在VB里就可以调用的!

#2


所有的CPLAYER_API改成 extern "C" CPLAYER_API
extern "C"表示可以使其他编程语言访问你编写的DLL中的函数

#3


还有一点,最好这样:
把你要export的函数写在def中。

#4


#define  CPLAYER_API extern"C" __declspec(dllimport)
定义宏CPLAYER_API时,本身就包含了extern "C"了,为什么还要再加上extern "C"?

#5


I think you should export the function to VB application. for example:
#define CPLAYER_API extern "C" __declspec(dllexport) and you should define a .def file to export the function name.

you may try it :-)

#6


#define  CPLAYER_API extern"C" __declspec(dllimport)
把extern"C"去掉试一试,

#7


这个问题只能使用DEF文件来解决,我遇到过这样的问题.VB就只能这样子了.

#8


同意楼上的,不知道为什么dllexport跟.DEF文件定义的就是不一样。

我的程序也是只有用.DEF定义的出口才有效,不知道为什么?

还有:
#define  CPLAYER_API extern"C" __declspec(dllimport)
应当是:
#define  CPLAYER_API extern"C" __declspec(dllexport)
吧!

#9


如果像你们说的那样,应该所有的函数都不能用,可是在调用
MP4_ClientSetNetPort(WORD dServerPort,WORD dClientPort);
的时候没有报错。

#10


vb对dll 的要求比较严格, 用__declspec(dllexport) 申明的函数能够被调用,但是出现调用约定错误, 用 __export WINAPI 申明就可以了. 在vc6里面默认的环境__export WINAPI是个warning ,不能生成dll 文件. 但是在bcb 里面却一切正常.