vc++ 2008 调用 VB创建的DLL

jqy3222089 2009-11-04 09:53:00
添加VBdll到类中后,编译发现一只弹出编译错误。

e:\mfc\activextest\activextest\debug\scommon.tlh(105) : error C2146: 语法错误 : 缺少“;”(在标识符“EnumData”的前面)
1>e:\mfc\activextest\activextest\debug\scommon.tlh(105) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\mfc\activextest\activextest\debug\scommon.tlh(107) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\mfc\activextest\activextest\debug\scommon.tlh(107) : warning C4183: “EnumData”: 缺少返回类型;假定为返回“int”的成员函数
1>e:\mfc\activextest\activextest\debug\scommon.tlh(552) : error C2143: 语法错误 : 缺少“}”(在“常量”的前面)
1>e:\mfc\activextest\activextest\debug\scommon.tlh(555) : error C2143: 语法错误 : 缺少“;”(在“}”的前面)
1>e:\mfc\activextest\activextest\debug\scommon.tlh(555) : error C2059: 语法错误 : “}”
1>e:\mfc\activextest\activextest\debug\scommon.tli(63) : error C2143: 语法错误 : 缺少“;”(在“_ClsConfig::EnumData”的前面)
1>e:\mfc\activextest\activextest\debug\scommon.tli(63) : error C2433: “_CollectionPtr”: 不允许在数据声明中使用“inline”
1>e:\mfc\activextest\activextest\debug\scommon.tli(63) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\mfc\activextest\activextest\debug\scommon.tli(63) : error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\mfc\activextest\activextest\debug\scommon.tli(67) : error C2064: 项不会计算为接受 2 个参数的函数
1>生成日志保存在“file://e:\MFC\ActiveXTest\ActiveXTest\Debug\BuildLog.htm”
...全文
159 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
jqy3222089 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 jameshooo 的回复:]
我怀疑dwFlags不是枚举名称,更像一个变量名称,先用rename改名试试
[/Quote]
恩,已经搞好了,后面加了auto_rename
jameshooo 2009-11-06
  • 打赏
  • 举报
回复
我怀疑dwFlags不是枚举名称,更像一个变量名称,先用rename改名试试
jqy3222089 2009-11-05
  • 打赏
  • 举报
回复
其中,编译之后的的错误提示为:

1>e:\mfc\activextest\activextest\debug\scommon.tlh(552) : error C2143: 语法错误 : 缺少“}”(在“常量”的前面)
1>e:\mfc\activextest\activextest\debug\scommon.tlh(555) : error C2143: 语法错误 : 缺少“;”(在“}”的前面)
1>e:\mfc\activextest\activextest\debug\scommon.tlh(555) : error C2059: 语法错误 : “}”
jqy3222089 2009-11-05
  • 打赏
  • 举报
回复
OK,谢谢大家的支持。15楼有部分是正确的,我需要在我的DLL import之前加入

#import "msvbvm60.dll" no_namespace rename("EOF", "EndOfFile") rename("RGB","ColorRGB")

然后_CollectionPtr就编译通过了,但是还有下面的一个东西没有编译通过

enum __declspec(uuid("65dff665-16f2-4b2a-a945-1fa4e8a1876a"))
dwFlags
{
LWA_COLORKEY = 1,
LWA_ALPHA = 2,
LWA_COMBINE = 3
};

有没有人知道这个是不是也需要import个VB的DLL?
jameshooo 2009-11-05
  • 打赏
  • 举报
回复
如果你都不知道是哪个文件,我就更不知道了。你可以用Oleview工具查找系统中已经注册的类型库和接口,很容易找到是哪个文件的。
jqy3222089 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 summerheart 的回复:]
_CollectionPtr 我猜想是VB运行库里定义的吧,
因为在VB中Collection是 VB内置的。
_CollectionPtr 就应该是对Collection的引用 

是不是也 应该把VB运行库导入呢?!
[/Quote]
如何导入VB运行库呢?是哪个文件?
jqy3222089 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 jameshooo 的回复:]
_Collection接口没有导入成功,检查一下TLH文件中有没有_Collection的定义。

如果没有,原因可能是:
1、_Collection符号跟现有符号冲突,导致导入失败,此时应该在import时使用rename属性改成另一个名称
2、_Collection接口可能不是在scommon的类型库中定义的,找到定义它的类型库,并首先#import它
[/Quote]
我引用DLL的时候是这样写的,
import "C:\\Users\\JQY\\Desktop\\DLL\\SCommon.dll" no_namespace

应该改成什么呢,我是新手,不好意思 呵呵
jameshooo 2009-11-04
  • 打赏
  • 举报
回复
_Collection接口没有导入成功,检查一下TLH文件中有没有_Collection的定义。

如果没有,原因可能是:
1、_Collection符号跟现有符号冲突,导致导入失败,此时应该在import时使用rename属性改成另一个名称
2、_Collection接口可能不是在scommon的类型库中定义的,找到定义它的类型库,并首先#import它
编程夜猫 2009-11-04
  • 打赏
  • 举报
回复
_CollectionPtr 我猜想是VB运行库里定义的吧,
因为在VB中Collection是 VB内置的。
_CollectionPtr 就应该是对Collection的引用

是不是也 应该把VB运行库导入呢?!
jqy3222089 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 akirya 的回复:]
你看前面有没有_CollectionPtr这个类型的声明 ?
[/Quote]
从VB的DLL文件中看,还是VC工程中?
从scommon.tlh文件中没有找到这个_CollectionPtr的声明。。。。
jqy3222089 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 summerheart 的回复:]
VB的DLL是基于COM的。

VC应该是用COM的方式使用。不知道楼主是如何用的。
[/Quote]
我用的正是调用COM的方法调用的,首先导出类的时候编译就出错了。。。。
  • 打赏
  • 举报
回复
你看前面有没有_CollectionPtr这个类型的声明 ?
jqy3222089 2009-11-04
  • 打赏
  • 举报
回复
然后在scommon.tli文件中的错误是

inline long _ClsConfig::ReNameValue ( BSTR * INIKey, BSTR * INIValue, BSTR * NewValue ) {
long _result = 0;
HRESULT _hr = raw_ReNameValue(INIKey, INIValue, NewValue, &_result);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _result;
}

inline _CollectionPtr _ClsConfig::EnumData ( BSTR * INIKey, BSTR * INIValue ) {
struct _Collection * _result = 0;
HRESULT _hr = raw_EnumData(INIKey, INIValue, &_result);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _CollectionPtr(_result, false);
}

jqy3222089 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 akirya 的回复:]
引用 4 楼 jqy3222089 的回复:
引用 2 楼 akirya 的回复:
这个你给出VB的dll会容易一些

VB的DLL比较多,贴出来估计会看晕掉的。。。。我主要是想导出DLL中的ClsStream类,但这个类又用到了ClsConfig中的变量,我估计是不是这个地方会有问题


有dll比较容易看到问题。要不你贴出报错的tlh文件
[/Quote]

long ReNameValue (
BSTR * INIKey,
BSTR * INIValue,
BSTR * NewValue );
_CollectionPtr EnumData (
BSTR * INIKey,
BSTR * INIValue );

_bstr_t GetData (
BSTR * INIKey,
BSTR * INIValue );
。。。。
struct __declspec(uuid("ae7390d0-832f-4c5a-8348-82191624044a"))
__ClsDynamicUI : IDispatch
{
//
// Wrapper methods for error-handling
//

// Methods:
HRESULT ActionCompleted (
IDispatch * * Obj,
enum EnumActPara * ActionType,
BSTR * Tip,
VARIANT_BOOL * Breaked );
};

enum __declspec(uuid("65dff665-16f2-4b2a-a945-1fa4e8a1876a"))
dwFlags
{
LWA_COLORKEY = 1,
LWA_ALPHA = 2,
LWA_COMBINE = 3
};


出错部分为红色部分,这个文件是scommon.tlh
编程夜猫 2009-11-04
  • 打赏
  • 举报
回复
VB的DLL是基于COM的。

VC应该是用COM的方式使用。不知道楼主是如何用的。
jqy3222089 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 oyljerry 的回复:]
#import正确导入dll了?
[/Quote]
应该正确导入了
#import "C:\\Users\\JQY\\Desktop\\DLL\\SCommon.dll" no_namespace
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jqy3222089 的回复:]
引用 2 楼 akirya 的回复:
这个你给出VB的dll会容易一些

VB的DLL比较多,贴出来估计会看晕掉的。。。。我主要是想导出DLL中的ClsStream类,但这个类又用到了ClsConfig中的变量,我估计是不是这个地方会有问题

[/Quote]
有dll比较容易看到问题。要不你贴出报错的tlh文件
jqy3222089 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 akirya 的回复:]
这个你给出VB的dll会容易一些
[/Quote]
VB的DLL比较多,贴出来估计会看晕掉的。。。。我主要是想导出DLL中的ClsStream类,但这个类又用到了ClsConfig中的变量,我估计是不是这个地方会有问题
oyljerry 2009-11-04
  • 打赏
  • 举报
回复
#import正确导入dll了?
  • 打赏
  • 举报
回复
这个你给出VB的dll会容易一些
加载更多回复(1)

16,551

社区成员

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

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

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