游戏开发论坛

 找回密码
 立即注册
搜索
楼主: bigbook2000

关于VB6和VC6混编

[复制链接]

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2005-9-6 10:45:00 | 显示全部楼层

Re:关于VB6和VC6混编

那是VC的问题,如果你不是很清楚,那么需要学习VC,VC的例子我也用的,可以参考其他版面的帖子,在这里讨论不是很好,呵呵

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
发表于 2005-9-7 03:51:00 | 显示全部楼层

这回关VB的事了

VC中:

#include "stdafx.h"
#include "d3d8types.h"

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

int __stdcall RectAlphaBlend( D3DLOCKED_RECT * oRect, D3DLOCKED_RECT iRect )
{
        (*oRect) = iRect; //随便写的
        return iRect.Pitch;
}

VB中:

Private Declare Function RectAlphaBlend Lib "WDPixelProcessing.dll" (ByVal oRect As D3DLOCKED_RECT, iRect As D3DLOCKED_RECT) As Long
...
...
Dim pData As D3DLOCKED_RECT
... '这里Lock了
Debug.Print RectAlphaBlend(pData, ByVal pData) '此处出错,提示“用户定义类型不能用”

现在怎办?

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2005-9-7 14:52:00 | 显示全部楼层

Re:关于VB6和VC6混编

首先D3DLOCKED_RECT在DxVBLibA的VB库中是有定义的,你需要在VB中引用DirectX对象

或者你自己定义该对象也可以
Type D3DLOCKED_RECT
    pBits As Long
    Pitch As Long
End Type

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
发表于 2005-9-7 17:49:00 | 显示全部楼层

Re:关于VB6和VC6混编

很显然,我已经引用了DX,否则,能lock吗

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
发表于 2005-9-7 18:26:00 | 显示全部楼层

Re:关于VB6和VC6混编

自己解决了,按照MSDN上的说法,找到解决的方法了:

在VC中,自定义类型(包括DX的)的参数必须按指针传递

在VB中,不能用ByVal声明自定义类型的参数的传递方式,与VC同样做法,只能ByRef

MSDN上说:“如果不希望因过程或函数的调用而造成参数的改变,用 Dim 声明一个该类型的临时变量然后将此变量传给此过程。”

修改后DLL正常运行

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2005-9-8 10:50:00 | 显示全部楼层

Re: 关于VB6和VC6混编

在VC中,自定义类型(包括DX的)的参数必须按指针传递


没这回事

这个跟VC没关系的,VC中没有传值和传地址之说,传地址就是用指针

所以按照你VC的定义,你应该将VB中的声明改一下


Private Declare Function RectAlphaBlend Lib "WDPixelProcessing.dll" (ByRef oRect As D3DLOCKED_RECT, ByVal iRect As D3DLOCKED_RECT) As Long

Debug.Print RectAlphaBlend(pData, ByVal pData)

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
发表于 2005-9-8 14:49:00 | 显示全部楼层

Re:关于VB6和VC6混编

只要在声明API时使用ByVal 声明自定义类型就错误,这是MSDN说的,因此D3DLOCKED_RECT 等自定义类型都必须以指针传递给DLL

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
发表于 2005-9-8 14:54:00 | 显示全部楼层

Re: 关于VB6和VC6混编

MSDN截图:
sf_200598145428.jpg

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2005-9-9 12:10:00 | 显示全部楼层

Re:关于VB6和VC6混编

VB中我还真没用过,但VC中没有这个说法的

53

主题

241

帖子

252

积分

中级会员

Rank: 3Rank: 3

积分
252
发表于 2005-9-9 14:56:00 | 显示全部楼层

Re:关于VB6和VC6混编

只要知道必须以ByRef方式传递自定义类型就OK了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-27 18:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表