vc下调用dll文件为什么不是想要的结果?

DreamMan81 2010-12-08 10:05:36
#include "stdafx.h"
#include <windows.h>

typedef int (*pt_show)(void);

int main(int argc, char* argv[])
{
int sd;
HINSTANCE init=LoadLibrary("F:\\program\\pj1208103\\Debug\\df.dll");
if (init)
{
pt_show p=(pt_show)GetProcAddress(init,"ShowMessage");
if (p)
return sd=p()为什么不执行?;
printf("%d",sd);
FreeLibrary(init);
}
return 0;
}
...全文
109 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
maoxing63570 2010-12-09
  • 打赏
  • 举报
回复

//===============mydef.cpp===
#define DLL extern "C" _declspec(dllexport)
#include "mydef.h"
int DLL add_(int x,int y)
{
return x+y;
}

上面的第二个改成这个就可以了
maoxing63570 2010-12-09
  • 打赏
  • 举报
回复

//=====mydef.h=========
#ifndef MYDEF_H
#define DLL extern "C"_declspec(dllimport)
int DLL add_(int x,int y);
#endif


//===============mydef.cpp===
#define DLL extern "C"_declspec(dllexport)
#include "mydef.h"
int DLL add_(int x,int y)
{
return x+y;
}
#include "mydef.h"
int DLL add_(int x,int y)
{
return x+y;
}



#include <stdio.h>
#include "mydef.h"
#include <windows.h>

void main()
{
int sd;
char *str="add";
typedef int (*mydef_add)(int,int);
HINSTANCE k=LoadLibrary("F:\\program\\pj1208202\\Debug\\pj1208201.dll");
if (k)
{
mydef_add p=(mydef_add)GetProcAddress(k,"add_");
if (p!=NULL)
sd=p(2,3);
printf("hello!%d\n",sd);
FreeLibrary(k);
}
}

cout<<"you happy?"
rendao0563 2010-12-09
  • 打赏
  • 举报
回复
extern "C"
luciferisnotsatan 2010-12-09
  • 打赏
  • 举报
回复
定义了WZD_DLL这个宏没有,
装了vc,有个depends工具,用那个工具看看add_那函数有没有被导出?
DreamMan81 2010-12-09
  • 打赏
  • 举报
回复
再加10分,望各位大虾指教!
DreamMan81 2010-12-09
  • 打赏
  • 举报
回复
#include <stdio.h>
#include "mydef.h"
#include <windows.h>
/*
#pragma comment(lib,"F:\\program\\pj1208202\\Debug\\df.lib")
*/

void main()
{
//int sd=add(2,3);
int sd;
char *str="add";
typedef int (*mydef_add)(int,int);
HINSTANCE k=LoadLibrary("F:\\program\\pj1208202\\Debug\\pj1208201.dll");
if (k)
{
mydef_add p=(mydef_add)GetProcAddress(k,"add_");
if (p!=NULL)
sd=p(2,3);
printf("hello!%d\n",sd);
FreeLibrary(k);
}
}
//=====mydef.h=========
#ifdef WZD_DLL
#define DLL _declspec(dllexport)
#else
#define DLL
#endif

int DLL add_(int x,int y);
//===============mydef.cpp===
#include "mydef.h"
int DLL add_(int x,int y)
{
return x+y;
}
#include "mydef.h"
int DLL add_(int x,int y)
{
return x+y;
}
上述是源代码,看来看去都没什么问题,问什么GetProcAddress获得的函数地址为空呢?
DreamMan81 2010-12-09
  • 打赏
  • 举报
回复
原来是没有加extern "C".而且还要头文件。问题解决了,I'm happy.
非常感谢“独钓寒江雪”
DreamMan81 2010-12-08
  • 打赏
  • 举报
回复
将 return sd=p()中的return去掉。请大家不要觉得诡异,这只是
我的一个测试代码而已!
cranium 2010-12-08
  • 打赏
  • 举报
回复
诡异的逻辑。

诡异1: 需要打印输出却在printf之前 return,肯定看不到输出结果(不知道楼主是不是靠这个判断函数没执行的)

诡异2: 需要释放DLL,却在DLL释放之前 renturn。
DreamMan81 2010-12-08
  • 打赏
  • 举报
回复
你调试看看,最大的可能性是函数导出失败,没有执行if(p),条件为假.
这我知道,可ShowMessage()函数确实在df.dll中,可为什么就
找不到呢?
xiaohuh421 2010-12-08
  • 打赏
  • 举报
回复
dll是否加载成功?
函数导出是否成功?
你调试看看,最大的可能性是函数导出失败,没有执行if(p),条件为假
ouyh12345 2010-12-08
  • 打赏
  • 举报
回复
用vs2005或以上运行该程序,看是否出错?
dxms8 2010-12-08
  • 打赏
  • 举报
回复
好诡异的代码。。
无参函数指针去接一个有参函数。。。
google下函数指针用法吧
DreamMan81 2010-12-08
  • 打赏
  • 举报
回复
int ShowMessage()
{
int sd=5;
return sd;
}
这是showmessage函数
DreamMan81 2010-12-08
  • 打赏
  • 举报
回复
我确认了sd应该等于5;
bruceteen 2010-12-08
  • 打赏
  • 举报
回复
你怎么知道没执行?
ouyh12345 2010-12-08
  • 打赏
  • 举报
回复
调用约定是否一致?
Rabbit-Soft 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]

调用约定是否一致?
[/Quote]同意
xuting0 2010-12-08
  • 打赏
  • 举报
回复
sd=p() 类型都不一样 还赋值
xspace_time 2010-12-08
  • 打赏
  • 举报
回复
通常要把dll里的函数声明在主调用函数理也要写一遍以保证函数接口一致

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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