LoadLibrary的问题,请教高手(急!!!)

cboy2wzhx 2003-06-04 04:40:41
LoadLibrary返回0x10000000(MSDN上说是无效句柄)
GetProcAddress返回NULL
为什么?????
...全文
298 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
cboy2wzhx 2003-06-10
  • 打赏
  • 举报
回复
问题解决了
是编译器设置的问题

后来我用release版试了一下发现没有问题
才知道是编译器设置的问题

谢谢各位相助
准备结贴
Zark 2003-06-10
  • 打赏
  • 举报
回复
首先楼主要讲清楚,这个LoadLibrary()倒底有没有成功. "返还0x10000000表明LoadLibray()出错"这句话在MSDN上我没有看到过,可否贴出来看看.

我倒是认为0x10000000是个合法的句柄,由于没有出错,GetLastError()只是取得的是上次的错误码,与你的这个LoadLibrary()没有关系.

先弄清这个问题,咱们再分析你的第二问题(找不到函数地址).
realdreamer 2003-06-09
  • 打赏
  • 举报
回复
LoadLibrary 最能出现的问题就是路径问题.

LoadLibrary 不成功, GetProcAddress 当然也不会成功.

red-fly 2003-06-09
  • 打赏
  • 举报
回复
如果还不行的话,就是你的代码的问题了。具体的就是目录的路径问题。
先说一说你的目录结构,是在哪个目录下调用哪个文件,然后再调用哪个文件,最后是调用那个dll文件
就是把你所涉及到的文件和调用过程说一说,清楚点,不要再糊里糊涂地
ukyoking 2003-06-09
  • 打赏
  • 举报
回复
IObjectA是自己声明的接口,我这么使用没有问题啊,要不你把你的代码再多贴一些出来

#include "IObjectA.h"

int main(int argc, char* argv[])
{
HINSTANCE hDll = ::LoadLibrary("ObjectA.dll");

typedef IObjectA* CREATEFUNC();
CREATEFUNC* CreateObjectA;
CreateObjectA = reinterpret_cast<CREATEFUNC*>(::GetProcAddress(hDll,"CreateObjectA"));

IObjectA *pIObjectA = NULL;
pIObjectA = CreateObjectA();

for (int i = 0; i < 10; i++)
{
pIObjectA->ShowMember();
pIObjectA->IncrementMember();
}

delete pIObjectA;

::FreeLibrary(hDll);
}
ukyoking 2003-06-09
  • 打赏
  • 举报
回复
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

extern "C" __declspec (dllexport)
IObjectA *CreateObjectA()
{
IObjectA *pObject = new ClassA ;
return pObject ;
}
cboy2wzhx 2003-06-09
  • 打赏
  • 举报
回复
不是以上指出的错误

难道没有一个高手吗???
red-fly 2003-06-07
  • 打赏
  • 举报
回复
睁大眼睛看看回复吧
你的声明搞错了,还想有效句柄?笑话
孤必有邻 2003-06-07
  • 打赏
  • 举报
回复
GetProcAddress()有没有写错函数名。(注意大小写)
cboy2wzhx 2003-06-05
  • 打赏
  • 举报
回复
请问o_racle(璐璐)

LoadLibrary返回值为什么会没有保存下来呢?

我在调用GetProcAddress时的hmodule也是0x10000000而不是0x00000000

为什么?
o_racle 2003-06-05
  • 打赏
  • 举报
回复
错误6是“句柄无效”,说明你的LoadLibrary返回0x10000000并没有保存下来,所以在调用函数地址时为NULL;

还有如楼上那位所说,你的函数声明有问题,应该是:
__declspec(dllexport) int MyApi();

在实现里:
extern "C"
__declspec(dllexport) int MyApi()
{
return 3;
}
red-fly 2003-06-05
  • 打赏
  • 举报
回复
你的声明错了,要如下才对:
__declspec(dllexport) int MyApi();

在实现里:
extern "C"
__declspec(dllexport) int MyApi()
{
return 3;
}
shining_zhangcsdn 2003-06-05
  • 打赏
  • 举报
回复
在导出函数的声明前应该加extern "C"
cboy2wzhx 2003-06-05
  • 打赏
  • 举报
回复
请问楼上

那为什么LoadLibrary会出错呢?

iamknight 2003-06-05
  • 打赏
  • 举报
回复
如果是用C编译器编译的,自动在导出的函数前加一个“_”

如果是用C++编译器编译,会加上一串符号,而隐式调用时,编译会自动加以处理,显式调用处理必须将名字与编译器转换后的名字一致。

所以,我常用老式的。DEF导出,以确保导出函数名不会被编译器改变。
cboy2wzhx 2003-06-05
  • 打赏
  • 举报
回复
代码很简单,可以描述如下 :
其中main.h中声明了int __declspec(dllexport) MyApi();


#include <windows.h>
#include "main.h"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

int __declspec(dllexport) MyApi()
{
return 0;
}
cboy2wzhx 2003-06-05
  • 打赏
  • 举报
回复
GetLastError()返回6

请大家看清楚再回答啊

DLL是我自己写的,可以保证函数存在
而且隐式调用没有一点问题(不存在导出函数写错的问题)
只在显式调用中有问题

要是这么低级的问题,就不来请教各位高手了

难道没有一个高手知道么???
windows_editor 2003-06-05
  • 打赏
  • 举报
回复
extern "C" __declspec(dllexport) int MyApi()

NowCan 2003-06-04
  • 打赏
  • 举报
回复
估计又是函数名称被编译器改了。

同意楼上
AlvaChin 2003-06-04
  • 打赏
  • 举报
回复
GetLastError看看是什么错误阿。

另外用Dependience看看DLL中是否有你调用的函数。
可能的话,把源代码贴上来看看阿。
加载更多回复(4)

15,471

社区成员

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

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