新手问题:编译DLL时报错(高分,在线等待)

PrettyMurphy 2004-09-12 06:57:18
我用的是Win32 Dynamic-Link Library新建的工程:

代码完成后编译提示报错...出错信息如下:

--------------------Configuration: ETTEST - Win32 Debug--------------------
Compiling...
EtTEST.cpp
StdAfx.cpp
Linking...
Creating library Debug/ETTEST.lib and object Debug/ETTEST.exp
EtTEST.obj : error LNK2001: unresolved external symbol _OSDModCreateInstance@16
EtTEST.obj : error LNK2001: unresolved external symbol _CLSID_CRMA
EtTEST.obj : error LNK2001: unresolved external symbol _IID_IRMA
Debug/ETDVD.dll : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.
Creating browse info file...

ETTEST.dll - 4 error(s), 0 warning(s)

出错的代码如下:

int InitOSDDriver(void)
{
if(QFAILED(OSDModCreateInstance(0, &CLSID_CRMA, &IID_IRMA,(void**)(&(Info.pIRma)))))
{
Info.pIRma = NULL;
return 0;
}
return 1;
}

CLSID_CRMA, IID_IRMA这两个定义如下:

#ifndef RM_LIB_QGUID_ENTRY
typedef unsigned long QGUID;
#ifndef INITGUID
#define RM_LIB_QGUID_ENTRY(name, l) \
EXTERN_C QGUID name;
#else
#define RM_LIB_QGUID_ENTRY(name, l) \
EXTERN_C QGUID name \
= { l };
#endif // INITGUID
#endif

RM_LIB_QGUID_ENTRY(IID_IRMA,0x00000001)

RM_LIB_QGUID_ENTRY(CLSID_CRMA,0x00010000)


我是新手,请教各位这几个错误怎么解决,谢谢?
...全文
273 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghxmagic 2004-09-15
  • 打赏
  • 举报
回复
H文件是不会执行宏的
mfmmfc 2004-09-15
  • 打赏
  • 举报
回复
change OSDModCreateInstance(0, &CLSID_CRMA, &IID_IRMA,(void**)(&(Info.pIRma))
to OSDModCreateInstance(0, CLSID_CRMA, IID_IRMA,(void**)(&(Info.pIRma))
PrettyMurphy 2004-09-14
  • 打赏
  • 举报
回复
CLSID_CRMA, IID_IRMA这两个定义如下:

#ifndef RM_LIB_QGUID_ENTRY
typedef unsigned long QGUID;
#ifndef INITGUID
#define RM_LIB_QGUID_ENTRY(name, l) \
EXTERN_C QGUID name;
#else
#define RM_LIB_QGUID_ENTRY(name, l) \
EXTERN_C QGUID name \
= { l };
#endif // INITGUID
#endif

RM_LIB_QGUID_ENTRY(IID_IRMA,0x00000001)

RM_LIB_QGUID_ENTRY(CLSID_CRMA,0x00010000)
oyljerry 2004-09-14
  • 打赏
  • 举报
回复
CLSID_CRMA,和IID_IRMA这两个参数定义是什么?
ghxmagic 2004-09-14
  • 打赏
  • 举报
回复
OSDModCreateInstance(0, &CLSID_CRMA, &IID_IRMA,(void**)(&(Info.pIRma))

CLSID_CRMA,
IID_IRMA好象是两个结构体名, 不是结构体变量. 结构体名不能到地址
PrettyMurphy 2004-09-14
  • 打赏
  • 举报
回复
出错的位置是:CLSID_CRMA,和IID_IRMA两个参数
xjb2001 2004-09-14
  • 打赏
  • 举报
回复


(void**)(&(Info.pIRma)));

怎么这样啊

问题应该是这里
PrettyMurphy 2004-09-14
  • 打赏
  • 举报
回复
这些我也知道的,但是我这个是在H文件里面引用了的呀?为什么找不到呢?
ghxmagic 2004-09-14
  • 打赏
  • 举报
回复
你仔细看一下
RM_LIB_QGUID_ENTRY(IID_IRMA,0x00000001)
RM_LIB_QGUID_ENTRY(CLSID_CRMA,0x00010000)
这两个宏的定义,

1. 宣言一个QGUID(unsigned long)类型变量IID_IRMA或CLSID_CRMA,
2. 然后: IID_IRMA = {0x00000001}; 或者说CLSID_CRMA = {0x00010000}; //类似这种写法(int a = {2})

---------
3. 你在 if(QFAILED(OSDModCreateInstance(0, &CLSID_CRMA, &IID_IRMA,(void**)(&(...
这句前先要调用这两个宏来申明两个QGUID型的变量并赋值. 以便做OSDModCreateInstance
方法的参数.
PrettyMurphy 2004-09-14
  • 打赏
  • 举报
回复
OK,回去试试,可为什么这样做呢?
ghxmagic 2004-09-14
  • 打赏
  • 举报
回复
int InitOSDDriver(void)
{
// Define IID_IRMA, CLSID_CRMA as u_long value first
---------------------
RM_LIB_QGUID_ENTRY(IID_IRMA,0x00000001)
RM_LIB_QGUID_ENTRY(CLSID_CRMA,0x00010000)
---------------------

if(QFAILED(OSDModCreateInstance(0, &CLSID_CRMA, &IID_IRMA,(void**)(&(Info.pIRma)))))
{
Info.pIRma = NULL;
return 0;
}
return 1;
}
PrettyMurphy 2004-09-14
  • 打赏
  • 举报
回复
顶....
DentistryDoctor 2004-09-13
  • 打赏
  • 举报
回复
估计你没提供实现。
PrettyMurphy 2004-09-13
  • 打赏
  • 举报
回复
OK,

QFAILED,OSDModCreateInstance这两个函数定义和实现等下贴上来,


估计不是它们的问题吧?
PrettyMurphy 2004-09-13
  • 打赏
  • 举报
回复
就是这一句:

OSDModCreateInstance(0, &CLSID_CRMA, &IID_IRMA,(void**)(&(Info.pIRma)));

出了问题...

CLSID_CRMA,和IID_IRMA两个参数不懂为什么要这么定义....

ghxmagic 2004-09-13
  • 打赏
  • 举报
回复
检查一下OSDModCreateInstance等三个函数的定义和实现部分
syy64 2004-09-13
  • 打赏
  • 举报
回复
头文件、库文件或目录不对。
PrettyMurphy 2004-09-13
  • 打赏
  • 举报
回复
typedef void far *LPVOID;
typedef QGUID QIID;
typedef QGUID QCLSID;
#define REFQCLSID QIID *
#define REFQIID QIID *

QRESULT OSDModCreateInstance(DWORD dwInstance, REFQCLSID rclsid, REFQIID riid,LPVOID *ppv);

详细定义如上..
PrettyMurphy 2004-09-13
  • 打赏
  • 举报
回复
不好意思昨天忘了贴上QFAILED,OSDModCreateInstance的定义和实现...

现在加上:

typedef LONG QRESULT;

QRESULT OSDModCreateInstance(DWORD dwInstance, REFQCLSID rclsid, REFQIID riid,LPVOID *ppv);

QFAILED定义如下:

#define QFAILED(Status) ((QRESULT)(Status) < 0)

搞不懂上面定义是什么意思.

请各位大大一定帮忙......真不懂 -_-!!
Mr-Chen 2004-09-13
  • 打赏
  • 举报
回复
可能是你自己引入的函数有问题
加载更多回复(9)

15,471

社区成员

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

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