我在调用一个CB写的DLL过程中,碰到这样一个奇怪的问题,急
编译没有问题,运行时,如果在InitDialog调用DLL中的函数不报错,但如果将调用DLL函数的部分写到别的地方去就出错。为什么?
//Send_Command_Word
typedef bool(*pFunction)(int portNumber,int iPictureCounts,
int iScreenID,int iPageID, int iMoveStyle, int iMoveSpeed, int iPauseTime);
pFunction pConfig = NULL;
mlib = LoadLibrary(TEXT("TMH-at90.dll"));
if(mlib)
{
AfxMessageBox("success"); pConfig = (pFunction)::GetProcAddress((HMODULE)mlib,"Send_Command_Word"); pConfig(1,1,85,0,1,1,1);
}
else
{
AfxMessageBox("faild");
}
错误提示:
0x0000000指令引用0X00000内存,该内存不能为“read"
编译没有问题,运行时,如果在InitDialog调用DLL中的函数不报错,但如果将调用DLL函数的部分写到别的地方去就出错。为什么?
//Send_Command_Word
typedef bool(*pFunction)(int portNumber,int iPictureCounts,
int iScreenID,int iPageID, int iMoveStyle, int iMoveSpeed, int iPauseTime);
pFunction pConfig = NULL;
mlib = LoadLibrary(TEXT("TMH-at90.dll"));
if(mlib)
{
AfxMessageBox("success"); pConfig = (pFunction)::GetProcAddress((HMODULE)mlib,"Send_Command_Word"); pConfig(1,1,85,0,1,1,1);
}
else
{
AfxMessageBox("faild");
}
错误提示:
0x0000000指令引用0X00000内存,该内存不能为“read"
解决方案 »
- 求大侠,帮助啊。MFC动态创建控件(CStatic),并且动态添加对应的响应事件
- MFC子线程添加列表字符串的问题(急急急)
- 用UDP文件传输
- 菜鸟弱问几个窗口的概念!
- 各位大侠好!请问VC有画曲线、报表的类吗?我想对采样数据进行分析,多谢!
- DBF文件加密了,打开文件提示 不是一个表 怎样才能读出数据!谢谢
- 救命!请版主不要删除!!
- 在COM接口中添加接口函数,myproject.idl文件中定义如下. 编译连接时出现语法错误," myproject.idl(24) : error MIDL2025 : syntax error
- socket通信中//Recv函数接受数据的大小,如何动态改变?
- 如何判断一个HINSTANCE是否有效
- about jpeg and zlib
- 怎样获取windows内存总量?
不知道为什么,最好能有更详细的代码。
[BCB6_Dll]
extern "C" __declspec(dllexport) bool __stdcall Send_Command_Word(int ,int , int ,int , int , int , int );bool __stdcall Send_Command_Word(int portNumber,
int iPictureCounts,
int iScreenID,
int iPageID,
int iMoveStyle,
int iMoveSpeed,
int iPauseTime)
{
char stemp[4];
itoa(portNumber, stemp, 10);
WritePrivateProfileString("port", "portNumber", stemp, "c:\\temp.ini");
itoa(iPictureCounts, stemp, 10);
WritePrivateProfileString("port", "iPictureCounts", stemp, "c:\\temp.ini");
itoa(iScreenID, stemp, 10);
WritePrivateProfileString("port", "iScreenID", stemp, "c:\\temp.ini");
itoa(iPageID, stemp, 10);
WritePrivateProfileString("port", "iPageID", stemp, "c:\\temp.ini");
itoa(iMoveStyle, stemp, 10);
WritePrivateProfileString("port", "iMoveStyle", stemp, "c:\\temp.ini");
itoa(iMoveSpeed, stemp, 10);
WritePrivateProfileString("port", "iMoveSpeed", stemp, "c:\\temp.ini");
itoa(iPauseTime, stemp, 10);
WritePrivateProfileString("port", "iPauseTime", stemp, "c:\\temp.ini");
return true;
}[VC6_Call_Dll]
void CMyCallDlg::OnButtonQ20031204()
{
typedef bool (__stdcall *pFunction)(int ,int , int ,int , int , int , int );
pFunction pConfig = NULL;
HINSTANCE mlib = LoadLibrary(TEXT("TMH-at90.dll"));
if(mlib != NULL)
{
pConfig = (pFunction)GetProcAddress(mlib, "Send_Command_Word");
if (pConfig != NULL)
(pConfig)(1,1,85,0,1,1,1);
}
else
{
AfxMessageBox("faild");
}
FreeLibrary(mlib);
}
哦,对了有点不同的是,我用了 __stdcall
用__stdcall我遇到过在函数退出的时候错误---------
++C++
---------
2. 调用约定:
__cdecl 缺省
是 Borland C++ 的缺省的 C 格式命名约定,它在标识符前加一下划线,以保留
它原来所有的全程标识符。参数按最右边参数优先的原则传递给栈,然后清栈。
extaern "C" bool __cdecl TestFunction();
在 def 文件中显示为
TestFunction @1
注释: @1 表示函数的顺序数,将在“使用别名”时使用。 __pascal Pascal格式
这时函数名全部变成大写,第一个参数先压栈,然后清栈。
TESTFUNCTION @1 //def file __stdcall 标准调用
最后一个参数先压栈,然后清栈。
TestFunction @1 //def file __fastcall 把参数传递给寄存器
第一个参数先压栈,然后清栈。
@TestFunction @1 //def file 3. 解决调用约定:
Microsoft 与 Borland 的 __stdcall 之间的区别是命名方式。 Borland 采用
__stdcall 的方式去掉了名字起前的下划线。 Microsoft 则是在前加上下划线,在
后加上 @ ,再后跟为栈保留的字节数。字节数取决于参数在栈所占的空间。每一个
参数都舍入为 4 的倍数加起来。这种 Miocrosoft 的 DLL 与系统的 DLL 不一样。
int iScreenID,int iPageID, int iMoveStyle, int iMoveSpeed, int iPauseTime);在vc中默认(省略)的调用方式__cdecl
而你的dll是 __stdcall 所以在前面加上__stdcall