社区
进程/线程/DLL
帖子详情
一个dll中调用另一个dll的问题
arbend
2003-11-20 11:37:49
请教各路高人,在我的一个dll中去调用另一个由C开发的dll(硬件驱动)模块的函数时,出现“0xC0000005:Access Violation”问题,请问为什么?该怎么解决?急盼回复!
...全文
179
13
打赏
收藏
一个dll中调用另一个dll的问题
请教各路高人,在我的一个dll中去调用另一个由C开发的dll(硬件驱动)模块的函数时,出现“0xC0000005:Access Violation”问题,请问为什么?该怎么解决?急盼回复!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
请大家帮我 :(
dll
中
调用
窗体
将窗体封装到
dll
中
,供其他程序
调用
,代码简单,演示说明
问题
。
Dll
中
创建窗体对话框并
调用
.zip_C++ 对话框
DLL
_C++
DLL
创建窗体_c++ rc创建窗口_connectedq
在MFC
中
,C++语言在
一个
dll
中
调用
另
一个
dll
DelphiXE10.3编写的静态
dll
及如何
调用
dll
的示例
DelphiXE10.3编写的静态
dll
及如何
调用
dll
的示例,简单好用,包含
dll
工程文件和exe工程文件
delphi 从外部
Dll
中
调用
子窗体
delphi 从外部
Dll
中
调用
子窗体. 关于
DLL
文件 的
调用
zugbruecke:从Linux,MacOS或BSD下运行的Python脚本在Windows
DLL
中
调用
例程
它允许从在Unices /类Unix系统(例如Linux,MacOS或BSD)上运行的Python代码
中
的Windows
DLL
中
调用
例程。 zugbruecke旨在替代Python标准库的ctypes模块。 zugbruecke建立在Wine之上。 在后台启动的独立Windows ...
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章