既懂VC又懂VB的高手请进!!

puzzle 2000-06-01 10:20:00
我用VC做了一个DLL,在VB下调用失败,如何解决?
DLL代码如下:
......
LPCTSTR msg = "sdhsdjifodjifofosdjijifoddjifo";
......
extern "C" __declspec(dllexport) BOOL ReadMessage(LPCTSTR& strRecv)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
strRecv = (LPCTSTR&)msg;
return TRUE;
}
在VB中声明如下:
Declare Function ReadMessage Lib "test4.dll" (ByRef strRecv
As String) As Boolean
在程序任意处调用ReadMessage(strRecv),希望能够得到DLL中msg的值。
代码如下:
Dim b As Boolean
Dim str_w As String
str_w = "VB Value"
b = ReadMessage(str_w)
但在VB的DEBUG模式下,出现“实时错误‘49’DLL调用约定错误,”的提示。
而如果我先生成EXE文件,直接执行EXE文件,则以上错误消失,但更头疼的事
情出现了!在DLL中对str_w的修改并不起作用。str_w的值在函数ReadMessage
返回后变为空。
回到VB的DEBUG状态下,发现Boolean型变量b为FALSE,也就是说ReadMessage
返回值为FALSE,进入VC的DEBUG状态,DLL中ReadMessage成功返回为TRUE。

我采用MFC正规DLL建立的工程,该DLL在VC下用静态连接方式调用是没有问题的。
但在VB下的调用却不成功。以下是我的疑点:
1.是否MFC方式建立的DLL不支持非MFC程序的调用?如果答案是支持,则下一个问题。
2.在VB调试状态下执行与生成EXE文件执行为什么不同?这也不重要。
3.我在DLL中提供的ReadMessage(LPCTSTR& strRecv)函数怎样才能够在VB中执行,
并能够在VB中得到DLL对形参值的改变。

谢谢!

...全文
511 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
puzzle 2000-06-05
  • 打赏
  • 举报
回复
感谢各位的关注,由于所列的分数有限,有些高手我没能
通过分数表示谢意,抱歉!!
按照gch老兄的指点,VB编译状态下执行出错的情况不再发生。
输出函数确实只能在DEF中声明,才能被VB调用。
qianqian同志提示的第二点似乎有待商榷,声明成byref是可以的。
jing及sjxf兄所说的stdcall我没有测试,因为使用WINAPI方式声明
输出函数已经解决了编译方式出错的问题。
至于BSTR类型的使用,小弟研究后再与各位高手探讨。
谢谢!
qianqian 2000-06-02
  • 打赏
  • 举报
回复
同志们搞搞清楚
1.VB的确用的是bstr,但是你们可不能强求VC的DLL用bstr呀,bstr是编activeX的时候才会强制使用这个string类型的!
2.VB的Declare语句,调用dll的string参数时,永远要使用byval,而你的声明写成了byref,这是问题的关键!
舟中夜起 2000-06-02
  • 打赏
  • 举报
回复
VC向导中有两种DLL类型,你换一种试一试
Kenny 2000-06-02
  • 打赏
  • 举报
回复
在VC6中,已不用什么DEF去输出函数了,你的函数声明方式没有问题。只是LPCTSTR&有待研究。我这种方式的参数一般都直接用LPCTSTR。既然是const char*, 就不能用strRecv = (LPCTSTR&)msg;这种方式去赋值,你可试试:
strcpy((char*)strRecv, msg);
wjf 2000-06-02
  • 打赏
  • 举报
回复
vb下的API调用都市__stdcall约定,问题就在这
alwaysakid 2000-06-02
  • 打赏
  • 举报
回复
我想问题是这样的:
通过EXTERN “C“声明的输出经过了C编译器的MANGLE,向LINKER的输出变为_ReadMessage(加了下划线)
VB引擎在DLL中寻找ReadMessage,当然找不到,返回的FALSE是GETPROCADDRESS的返回。
所以应该在DEF中声明。
wdh 2000-06-02
  • 打赏
  • 举报
回复
为什么要费这么大的力气来讨论这个问题呢?用vc做一个自动化服务器不就一切ok了吗?
jing 2000-06-01
  • 打赏
  • 举报
回复
用stdcall
wwwlgb 2000-06-01
  • 打赏
  • 举报
回复
1:dll 的声明不用引用试一试,
2:strcpy(strRecv ,(LPCTSTR&)msg);不用strRecv = (LPCTSTR&)msg
3:vb 中不存在bstr 这个key
4:详请请见<<vb5技术内幕>>,<<vb 程序员的windows API 讲座>>
puzzle 2000-06-01
  • 打赏
  • 举报
回复
请详细解释BSTR的使用。
我刚才试过,VB告诉我“用户定义类型未定义”??

另外,返回值为FALSE的问题我自己已经发现原因,
是因为VB与VC对TRUE和FALSE的数字表示冲突造成的。
wwwlgb 2000-06-01
  • 打赏
  • 举报
回复
数据类型的问题。VB用的是BSTR,串前面有一个长度信息,LPCTSTR与编译器选项有关。缓冲区应由VB提供,字符串应是定长的如 DIM STR AS STRING(50),STR=STRING(0,50).然后调用动态库函数。调用完后加一句STR=LEFT(STR,STR中字符0的位置)
softdoctor 2000-06-01
  • 打赏
  • 举报
回复
ReadMessage(LPCTSTR& strRecv)
参数应用BSTR类型!
puzzle 2000-06-01
  • 打赏
  • 举报
回复
还是不行!
现在我的问题是这样:
在VB下调用ReadMessage之后,该函数的返回值为FALSE,
而我在DLL中观察它明明返回的是TRUE!?
halfdream 2000-06-01
  • 打赏
  • 举报
回复
应该不是声明的问题。是字符串的类型不匹配吧。
VB 中的字符串,应该是对应VC中wchar_t* 吧。
而不是LPCTSTR 即 const char*

随便说一句,COM中常用的BSTR 就是Basic 的字符串。
gch 2000-06-01
  • 打赏
  • 举报
回复
将声名extern "C" __declspec(dllexport) BOOL ReadMessage(LPCTSTR& strRecv)
改位:BOOL WINAPI ReadMessage(LPCTSTR& strRecv)
然后在.def中加上:ReadMessage
sjxf 2000-06-01
  • 打赏
  • 举报
回复
1、在DEF文件中说明;
2、不要用extern "C" __declspec(dllexport) ,应用_stdcall
3、如果未用_stdcall,不要在VB的调试状态下用
royluo 2000-06-01
  • 打赏
  • 举报
回复
相信MS不会再改进了
因为现在有了COM
cimsnet 2000-06-01
  • 打赏
  • 举报
回复
可以说,上面的回答都是对的经过我的实验我认为
VB调用VC开发的DLL,为软还是有些问题没有作的很好。
VB只支持在DEF中定义的函数调用。
既输出函数必须在DEF中的输出函数列表中,如果不在
不管你用什么C语言的表示符都是不可行的
还请各位高手指点。

16,472

社区成员

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

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

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