| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2390 人关注过本帖
标题:在VB中,怎样将VC中DLL里的字符串变量读取出来?? 即:怎样在VB中得到DLL里 ...
只看楼主 加入收藏
爱已飘零
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2011-7-13
结帖率:57.14%
收藏
已结贴  问题点数:10 回复次数:7 
在VB中,怎样将VC中DLL里的字符串变量读取出来?? 即:怎样在VB中得到DLL里的”HELP”这个字符串?
DLL部份代码:
//101901.cpp
#include "stdafx.h"

char str[] = "HELP" ;

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

char*  _stdcall GetChar( )
{
    return str ;
}

VB声明:
Declare Function GetChar Lib "101901.dll" () As String
Vb调用DLL,代码:
Private Sub cmdCommand1_Click()
    Dim str1 As String
    str1 = GetChar()  ‘为什么str1这个字符串是空的呢,我想要的结果str1=”HELP”
    Print str            ‘显示出来是空的,什么都没有。
End Sub
搜索更多相关主题的帖子: 声明 return 字符串 
2011-10-20 11:21
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:0 
Private Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (ByVal lpString1 As String, ByVal lpString2 As long, ByVal iMaxLength As Long) As Long
Declare Function GetChar Lib "101901.dll" () As long
Private Sub cmdCommand1_Click()
    Dim str1 As String * 5
    lstrcpyn str1 , GetChar(),5  ‘为什么str1这个字符串是空的呢,我想要的结果str1=”HELP”
    Print str1            ‘显示出来是空的,什么都没有。
End Sub
2011-10-20 13:15
爱已飘零
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2011-7-13
收藏
得分:0 
回复 2楼 bczgvip
谢谢,但是还是不行啊,提示有类型不匹配。
图片附件: 游客没有浏览图片的权限,请 登录注册
2011-10-20 13:47
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:0 
Private Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (ByVal lpString1 As String, ByVal lpString2 As long, ByVal iMaxLength As Long) As Long
Declare Function GetChar Lib "101901.dll" () As long
Private Sub cmdCommand1_Click()
    Dim str1 As String * 5
    lstrcpyn str1 , GetChar(),5  
    Print str1            
End Sub
2011-10-20 15:20
爱已飘零
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2011-7-13
收藏
得分:0 
回复 4楼 bczgvip
非常感谢,可以了。
还有个问题。
但要是DLL中的变量str的字符串是不确定的,在VB中又怎样确定lstrcpyn 这个函数的第三个参数(即字符串的个数)呢?
2011-10-20 17:20
bczgvip
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:66
帖 子:1310
专家分:5312
注 册:2009-2-26
收藏
得分:10 
'没有个最大值吗?
Private Declare Function lstrcpyn Lib "kernel32" Alias "lstrcpynA" (ByVal lpString1 As String, ByVal lpString2 As long, ByVal iMaxLength As Long) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As long) As Long
Declare Function GetChar Lib "101901.dll" () As long
Private Sub cmdCommand1_Click()
    Dim str1 As String
    str1 = string$(lstrlen(getchar()),0)
    lstrcpyn str1 , GetChar(),len(str1)  
    Print str1            
End Sub
2011-10-20 21:19
爱已飘零
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2011-7-13
收藏
得分:0 
回复 6楼 bczgvip
谢谢,可以了。
lstrcpyn str1 , GetChar(),len(str1)‘不过这个函数的第三个参数,应该还要加1,即为len(str1)+1,要不然最后一个字符会丢失。

下次有不懂的地方再请教版主。
2011-10-21 09:47
爱已飘零
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2011-7-13
收藏
得分:0 
回复 6楼 bczgvip
版主,再请教个关于VB调用C++编写的winsock的DLL的问题。这个是基于UDP通信的。
DLL部份代码如下:
//PmuDll.cpp
struct SendData
{
    BYTE data[12] ;
}SendBuf,*pSendBuf;        //需要发送的数据包和数据包地址的缓存区

struct RecvData
{
    BYTE data[2] ;
}RecvBuf,*pRecvBuf;       //需要接收的数据包和数据包地址的缓存区

SOCKET s ;                    //声明套接字变量  
SOCKADDR_IN addrSock ;        //声明发送或接受数据的地址变量

void UDP_Socket(char *dwIP ,u_short PortNo)
{
    WSADATA wsadata ;                            //库版本的相关信息
    WORD wVersionRequested ;                        //加载的Winsock的版本
    int err ;                                        //用于标志初始化是否成功
wVersionRequested = MAKEWORD(2, 0) ;         //通过MAKEWORD给版本号//的高低位赋值
err = WSAStartup(wVersionRequested ,&wsadata) ;    //WSAStartup函数被用来加载Winsock库,即初始化//Socket环境,若返回0,初始化成功,否则初始化失败
    if(err != 0)
    {
        return ;
    }
    if (LOBYTE(wsadata.wVersion != 2) || HIBYTE(wsadata.wVersion != 0))
    {
        WSACleanup() ;
        MessageBox(NULL ,"版本出错!", "提示" ,MB_OK ) ;    //关闭SOCK环境
        return ;
    }
    s = socket(AF_INET ,SOCK_DGRAM ,0) ;                    //设置SOCKET套字
    if(INVALID_SOCKET == s)
    {
        MessageBox(NULL ,"创建套字失败!", "提示" ,MB_OK || MB_DEFBUTTON1 ) ;
        return ;
    }
    addrSock.sin_addr.S_un.S_addr = inet_addr(dwIP) ;            //IP地址
    addrSock.sin_family = AF_INET ;                            //网络类型
    addrSock.sin_port = htons(PortNo) ;                        //端口
    int len = sizeof(SOCKADDR) ;
    pSendBuf = &SendBuf ;                                    //需要发送数据包的地址
    //发送数据   
    sendto(s ,(char*)pSendBuf ,sizeof(SendData) + 1 ,0 ,(SOCKADDR*)&addrSock ,len) ;
   


//接收数据
    pRecvBuf = &RecvBuf ;
    recvfrom(s ,(char*)pRecvBuf ,sizeof(RecvData) ,0 ,(SOCKADDR*)&addrSock ,&len) ;
    closesocket(s) ;
    WSACleanup() ;
}

在VB中调用PmuDll.DLL时出现了问题,DLL中注释掉接收远程机数据包的函数(recvfrom),程序能够运行,且远程机也能接收到发给它的数据;若不注释掉这个recvfrom函数,VB程序一运行,然后再调用这个UDP_Socke函数,VB程序就卡死掉了。该怎样修改呢??
2011-10-21 13:29
快速回复:在VB中,怎样将VC中DLL里的字符串变量读取出来?? 即:怎样在VB中得到 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038069 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved