菜鸟请教dll显式加载问题

ashlet 2006-07-18 04:04:58
typedef void SRPROC(void);
HINSTANCE hInst;
SRPROC *pFun;
VERIFY(hInst =::LoadLibrary("Ex5_Win32.dll"));
VERIFY(pFun = (SRPROC*)::GetProcAddress(hInst,"Msg"));
(*pFun)();
我是想调用一个void fun(void)形函数的,但是出错了。那个函数隐式调用是没有出错的,证明dll那边OK,那究竟是那里出错了呢?
...全文
260 11 打赏 收藏 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
whwjn 2006-07-19
  • 打赏
  • 举报
回复
那是C++ 的mangled name现象,把
DLLEP void Msg(void)
{
MessageBox(NULL,"void(*)(void)"," ",MB_OK);
}
改成
extern "C" DLLEP void Msg(void)
{
MessageBox(NULL,"void(*)(void)"," ",MB_OK);
}
应该就OK了。
看看这篇文章:
http://www.lzu.edu.cn/netteach/jiaochen/c++/ch5/chap52.htm
火麒噬日 2006-07-19
  • 打赏
  • 举报
回复
留个记号
ashlet 2006-07-19
  • 打赏
  • 举报
回复
// Ex5_Win32dll.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

#define DLLEP __declspec(dllexport)
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

DLLEP void Msg(void)
{
MessageBox(NULL,"void(*)(void)"," ",MB_OK);
}
DLLEP int Add(int x,int y)
{
return x+y;
}

DLLEP int RetInt(int x)
{
return x;
}
/////////////以上是dll
void CDLL_TDlg::OnButton1()
{

//typedef int (* LPFNDLLFUNC1)(int);
//typedef int (* LPFNDLLFUNC1)(int,int);


HINSTANCE hDLL; // Handle to DLL
//LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer

hDLL = LoadLibrary("Ex5_Win32dll.dll");
if (hDLL != NULL)
{
//lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"?RetInt@@YAHH@Z");
//lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,"?Add@@YAHHH@Z");
void (*lpfnDllFunc1)();
lpfnDllFunc1 = (void(*)())GetProcAddress(hDLL,"?Msg@@YAXXZ");

if (!lpfnDllFunc1)
{
MessageBox("not load fun");
// handle the error

return ;
}
else
{
// call the function

lpfnDllFunc1();
/*CString temp;
int i = lpfnDllFunc1(100,50);
temp.Format("%d",i);
MessageBox(temp);*/
}
FreeLibrary(hDLL);
}
else
{
AfxMessageBox("no load dll");
}


}
以下是调用部分。
为什么我用GetProcAddress(hDLL,"Msg");GetProcAddress(hDLL,"Add");这样取不到函数地址,而一定要像上面那样?
"?RetInt@@YAHH@Z"这些就是用dumpbin看到的。
为什么我写的就不能像书上那样直接用Msg,Add这些名字呢?是那里出了什么错误吗?起高手赐教。
whwjn 2006-07-18
  • 打赏
  • 举报
回复
你的dll里面有没有导出Msg这个函数啊?用dumpbin看一看导出来了没有?
ashlet 2006-07-18
  • 打赏
  • 举报
回复
请问该怎么改
ashlet 2006-07-18
  • 打赏
  • 举报
回复
/*#pragma comment(lib,"Ex5_Win32.lib")
_declspec(dllimport) float addfloat(float x,float y);
_declspec(dllimport) int addint(int x,int y);
_declspec(dllimport) void Msg(void);
_declspec(dllimport) int Msg2(void);*/

/*CString str;
float i = addfloat(1,1);
str.Format("%f",i);
CEdit *et1 = (CEdit *)this->GetDlgItem(IDC_EDIT1);
et1->SetWindowText(str);
Msg();
Msg2();*/

去掉那些注释,用隐式的话是OK的

但是用上面的代码运行结果是
not load
NG
ashlet 2006-07-18
  • 打赏
  • 举报
回复



HINSTANCE hInst = LoadLibrary("Ex5_Win32.dll");
if(!hInst)
{
MessageBox("NL","NL");
FreeLibrary(hInst);
}

if(hInst)
{
typedef float (*MYFUNC)(float,float);
MYFUNC fun = NULL;

FARPROC hfun;
hfun = GetProcAddress(hInst, "Msg");
if(hfun)
{
MessageBox("load","load");
}
else
{
MessageBox("No load","No load");
}
//fun=(MYFUNC)GetProcAddress(hInst, "addfloat");
fun = (MYFUNC)hfun;
if(!fun)
{
MessageBox("NG","NG");
}
if(fun)
{
CString str;
float i = fun(5.0,8.0);
str.Format("res=%f",i);
CEdit *et1 = (CEdit *)this->GetDlgItem(IDC_EDIT1);
et1->SetWindowText(str);
}

FreeLibrary(hInst);
}

/*CString str;
float i = addfloat(1,1);
str.Format("%f",i);
CEdit *et1 = (CEdit *)this->GetDlgItem(IDC_EDIT1);
et1->SetWindowText(str);
Msg();
Msg2();*/
wanilyer 2006-07-18
  • 打赏
  • 举报
回复
HINSTANCE hInst = LoadLibrary("User32.DLL");

if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;

fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");

if(fun)
{
fun(this->GetSafeHwnd(), 0, nInAlpha, 2);
}

FreeLibrary(hInst);
}

wanilyer 2006-07-18
  • 打赏
  • 举报
回复
HINSTANCE hInst = LoadLibrary("User32.DLL");

if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;

//È¡µÃSetLayeredWindowAttributesº¯ÊýÖ¸Õë
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");

if(fun)
{
fun(this->GetSafeHwnd(), 0, nInAlpha, 2);
}

FreeLibrary(hInst);
}

给你一段源代码,你自己照猫画虎吧!
ashlet 2006-07-18
  • 打赏
  • 举报
回复
老哥还是不行哦
wanilyer 2006-07-18
  • 打赏
  • 举报
回复
(*pFun)();
把这个改成 pFun();

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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