一个dll中调用另一个dll的问题

arbend 2003-11-20 11:37:49
请教各路高人,在我的一个dll中去调用另一个由C开发的dll(硬件驱动)模块的函数时,出现“0xC0000005:Access Violation”问题,请问为什么?该怎么解决?急盼回复!
...全文
179 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
command1980 2003-11-26
  • 打赏
  • 举报
回复
不好意思,找不出来问题,只能帮你顶一下了
arbend 2003-11-21
  • 打赏
  • 举报
回复
楼上的做法没有用,不知道错误的'string'指的是什么,我根本没有用到什么CString类

各位高人帮帮我呀!
hz张三 2003-11-21
  • 打赏
  • 举报
回复
string?

#include <string.h>
arbend 2003-11-21
  • 打赏
  • 举报
回复
谢伯虎兄!
原来我是这样做的,可是在extern "C"处报错:
error C2059: syntax error : 'string',
为什么?
bohut 2003-11-21
  • 打赏
  • 举报
回复
dll中要导出的函数这样申明:
#define DllExport _declspec(dllexport)
extern "C" DllExport int _stdcall Test(int n)
{
......
}
arbend 2003-11-21
  • 打赏
  • 举报
回复
Sorry,粘贴后变样了,上面定义NewCapture应该是这样的:

//在.c文件中定义了该函数
HWND _declspec(dllexport) NewCapture(int iWndID)
{
... //略去注册窗口类代码

hWnd = CreateWindow(...);//这里执行到消息处理过程,执行多个其他函数后,
//开始使用我们载入的Dll函数RGBCaptureInitialise ( &numberOfDevices ),就出错了

...//其他代码略去
}
arbend 2003-11-21
  • 打赏
  • 举报
回复
不好意思,代码比较长,只能截取相关代码,请大家多些耐心,有需要说明之处请告知。
俺对dll编程不很熟悉,有某些低级错误尽管指出,感谢!

//这里是俺做的Dll模块入口
BOOL WINAPI DllMain(HINSTANCE hInstance,DWORD dwReason,LPVOID lpReserved)
{
HINSTANCE hInstanceRGBCapture;

hGlobalInstance = hInstance;

if(dwReason==DLL_PROCESS_ATTACH)
{

//载入我们要使用的Dll驱动文件
hInstanceRGBCapture = LoadAndLinkDLL ( );
if ( hInstanceRGBCapture == NULL )
{

return 0;
}
FreeLibrary ( hInstanceRGBCapture );
}
else if(dwReason=DLL_PROCESS_DETACH)
{

}

return 1;
}

//俺在.h文件中声明了本dll模块的一个输出函数,希望打开一个新窗口
#ifdef __cplusplus
extern "C" {
#endif

HWND _declspec(dllexport) NewCapture(int iWndID);

#ifdef __cplusplus
}
#endif
//在.c文件中定义了该函数
HWND _declspec(dllexport) NewCapture(int iWndID)
{
... //略去注册窗口类代码
hWnd = CreateWindow(...);//这里执行到消息处理过程,执行多个其他函数后,
//开始使用我们载入的Dll函数RGBCaptureInitialise ( &numberOfDevices ),就出错了
}

//下面是装载Dll驱动文件的函数,顺利执行。其中APIFNENTRY结构定义如下:
/*********************
typedef struct
{
#if 1
FARPROC *PFnPtr;
LPCSTR FnName;
#else
APIFN *PFnPtr;
char *FnName;
#endif
} APIFNENTRY, FAR *LPAPIFNENTRY, FAR *LPAPIFNLIST;
************************/

HMODULE LoadAndLinkDLL()
{
APIFNENTRY FnList[] =
{
#define API(type,modifier,name,args) \
{ (FARPROC *)&name, #name },
#include "rgbcacc.h"
#undef API
{ NULL, NULL }
};
char nameOfDLL[_MAX_PATH];
LONG lError;
HKEY hKey;
HMODULE hDLL;

lError = RegOpenKey ( HKEY_LOCAL_MACHINE, RegistryKeyName, &hKey );
if ( lError == ERROR_SUCCESS )
{
DWORD dwType;
DWORD dwLength;

dwType = REG_SZ;
dwLength = sizeof ( nameOfDLL );
lError = RegQueryValueEx ( hKey, RGBCaptureDLLName, NULL,
&dwType, (LPBYTE)nameOfDLL, &dwLength );

RegCloseKey ( hKey );
}
if ( lError != ERROR_SUCCESS )
{
MessageBox ( NULL, "Unable to read path from Registry.", NULL,
MB_OK | MB_ICONERROR );
return NULL;
}

hDLL = LoadLibrary ( nameOfDLL );
if ( hDLL == NULL )
{
char text[80];
wsprintf("Unable to load %s", nameOfDLL);
MessageBox ( NULL, text, NULL,
MB_OK | MB_ICONERROR );
return NULL;
}

//这里载入用到的Dll函数,执行没有问题
if ( !APILoadFunctions ( hDLL, FnList, "" ))
{
char text[80];
wsprintf(text, "Incompatible version of %s", nameOfDLL);
MessageBox ( NULL, text, NULL,
MB_OK | MB_ICONERROR );
return NULL;
}
return hDLL;
}

//俺定义的APILoadFunctions()函数如下(LPAPIFNLIST在上面说明):
int APILoadFunctions (
HINSTANCE hInstance,
LPAPIFNLIST lpFnList,
void *pReserved )

{
int i = 0;

while ( lpFnList[i].PFnPtr )
{
*lpFnList[i].PFnPtr = GetProcAddress ( hInstance, lpFnList[i].FnName );
if ( *lpFnList[i].PFnPtr == NULL )
{
return FALSE;
}
i++;
}
return TRUE;
}
arbend 2003-11-21
  • 打赏
  • 举报
回复
还是没有解决,是不是dll导出函数编写有问题?请指教
arbend 2003-11-21
  • 打赏
  • 举报
回复
怎么没人顶上?
command1980 2003-11-20
  • 打赏
  • 举报
回复
前几天遇到同样一个问题,就是内存越界,这得要看你的原码了
ljzcom 2003-11-20
  • 打赏
  • 举报
回复
把代码贴出来。。
xiaohyy 2003-11-20
  • 打赏
  • 举报
回复
内存访问违规,是由无效指针引起的,把代码贴出来。。
arbend 2003-11-20
  • 打赏
  • 举报
回复
请大家帮我 :(

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧