游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7469|回复: 15

使用vb写一个简单的dll调用实例问题(翻译vc++ as VB)

[复制链接]

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
发表于 2008-2-17 21:36:00 | 显示全部楼层 |阅读模式
能否把忙把这段c++的代码翻译成vb


  1. // test.cpp : 定义控制台应用程序的入口点。
  2. //

  3. #include "stdafx.h"

  4. #include <iostream>
  5. #include <windows.h>

  6. typedef void (__stdcall *CShowHelloWorld)(void);

  7. void _InitDLL()
  8. {
  9.     HINSTANCE hinstLib;
  10.     CShowHelloWorld ShowHelloWorld;

  11.     // init dll instance handle
  12.     hinstLib = LoadLibrary("DllProcs.dll");
  13.     if (hinstLib != NULL)
  14.         {
  15.                 // load address
  16.                 ShowHelloWorld = (CShowHelloWorld) GetProcAddress(hinstLib, "ShowHelloWorld");

  17.                 // call the ShowAdd function.
  18.                 ShowHelloWorld();

  19.                 // free dll instance handle
  20.                 FreeLibrary(hinstLib);
  21.         }
  22.         else
  23.         {
  24.                 std::cout<< "need copy DLLProcs.dll to EXE dirtory" << std::endl;
  25.         }
  26. }

  27. int main(int argc, _TCHAR* argv[])
  28. {
  29.         _InitDLL();
  30.         return 0;
  31. }
复制代码

0

主题

386

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
QQ
发表于 2008-2-19 15:39:00 | 显示全部楼层

Re:使用vb写一个简单的dll调用实例问题(翻译vc++ as VB)

翻译当然可以,但C++和VB不一样。翻译意思就不太项一样。好多数据类型VB也没有。这段代码在VB中是执行不了的。
头文件就不翻译了,VB没有。

这是按原代码翻译的。

Function _InitDLL()
Dim hinstLib as HINSTANCE
Dim ShowHelloWorld as CShowHelloWorld
'init dll instance handle
hinstLib = LoadLibrary("DllProcs.dll")
If hinstLib<>Null then
'load address
ShowHelloWorld = (CShowHelloWorld) GetProcAddress(hinstLib, "ShowHelloWorld")
Call ShowHelloWorld()
Call FreeLibrary(hinstLib)
Else
Print "need copy DLLProcs.dll to EXE dirtory"
End Function

Private Sub Form_Load()
Call _InitDLL()
End Sub


0

主题

386

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
QQ
发表于 2008-2-19 15:53:00 | 显示全部楼层

Re:使用vb写一个简单的dll调用实例问题(翻译vc++ as VB)

如果用VB完成同样的功能就更容易了。
Declare Function函数名Lib [Alias " 别名]([ByVal 参数AS类型])AS类型  就行了啊

29

主题

475

帖子

483

积分

中级会员

Rank: 3Rank: 3

积分
483
发表于 2008-2-19 21:42:00 | 显示全部楼层

Re:使用vb写一个简单的dll调用实例问题(翻译vc++ as VB)

VB不支持强制类型转换,诸如
ShowHelloWorld = (CShowHelloWorld) GetProcAddress(hinstLib, "ShowHelloWorld")
在VB中是不成立的。

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
 楼主| 发表于 2008-2-19 22:36:00 | 显示全部楼层

Re:使用vb写一个简单的dll调用实例问题(翻译vc++ as VB)

2楼的代码,我搞了半天没弄对。3楼的代码,非常容易。因为我只是调用一下dll,做一个demo in c++ call with vb.固选用3楼的方案。

我使用如下声明。顺利通过
Declare Auto Function ShowHello Lib "DllProc.dll" Alias "ShowHello" () As Integer

他对winapi-stdcall为默认调用方式有效,c++的函数均可顺利调用,我有些dll是使用free pascal编译的cdecl调用方式,当我使用64k buffer作为参数传递时便stacks异常,而单个如integer,double则没有问题。

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
 楼主| 发表于 2008-2-19 22:45:00 | 显示全部楼层

Re: 使用vb写一个简单的dll调用实例问题(翻译vc++ as VB)

查阅联机,找到约定,可这是class,有没有直接function的指点?

另外,再虚心请教题外2个问题

怎么在vb的ide中使用类似vc++的PrintDebug,assert这种函数?
Imports那些库可有什么翻阅它的方式吗?例如我想翻阅"Imports System.Runtime.InteropServices"的代码,那么我应该如何干?



  1. Imports System
  2. Imports Microsoft.VisualBasic
  3. Imports System.Runtime.InteropServices

  4. Public Class LibWrap
  5. <DllImport("msvcrt.dll", CallingConvention := CallingConvention.Cdecl)> _
  6. Overloads Shared Function printf ( _
  7.     format As String, i As Integer, d As Double) As Integer
  8. End Function

  9. <DllImport("msvcrt.dll", CallingConvention := CallingConvention.Cdecl)> _
  10. Overloads Shared Function printf ( _
  11.     format As String, i As Integer, s As String) As Integer
  12. End Function

  13. xxxxxx...........

  14. End Class 'LibWrap
复制代码

15

主题

2093

帖子

2093

积分

金牌会员

Rank: 6Rank: 6

积分
2093
发表于 2008-2-19 23:23:00 | 显示全部楼层

Re: Re: 使用vb写一个简单的dll调用实例问题(翻译vc++ as VB)

PassByYou: Re: 使用vb写一个简单的dll调用实例问题(翻译vc++ as VB)

例如我想翻阅"Imports System.Runtime.InteropServices"的代码,那么我应该如何干?


.net类库?查MSDN就可以了

0

主题

25

帖子

25

积分

注册会员

Rank: 2

积分
25
发表于 2008-2-19 23:50:00 | 显示全部楼层

Re: Re:使用vb写一个简单的dll调用实例问题(翻译vc++ as VB)

PassByYou: Re:使用vb写一个简单的dll调用实例问题(翻译vc++ as VB)

2楼的代码,我搞了半天没弄对。3楼的代码,非常容易。因为我只是调用一下dll,做一个demo in c++ call with...


[DllImport("xxxxx", CallingConvention = CallingConvention.Cdecl)]

0

主题

386

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
QQ
发表于 2008-2-20 01:05:00 | 显示全部楼层

Re: Re:使用vb写一个简单的dll调用实例问题(翻译vc++ as VB)

大元帅: Re:使用vb写一个简单的dll调用实例问题(翻译vc++ as VB)

VB不支持强制类型转换,诸如
ShowHelloWorld = (CShowHelloWorld) GetProcAddress(hinstLib, "ShowHe...


这我当然明白,那请你给转换下这句。

0

主题

386

帖子

400

积分

中级会员

Rank: 3Rank: 3

积分
400
QQ
发表于 2008-2-20 01:09:00 | 显示全部楼层

Re: Re: 使用vb写一个简单的dll调用实例问题(翻译vc++ as VB)

PassByYou: Re: 使用vb写一个简单的dll调用实例问题(翻译vc++ as VB)

查阅联机,找到约定,可这是class,有没有直接function的指点?

另外,再虚心请教题外2个问题

怎么在...


没明白你说的是什么意思,你的PrintDebug是否是VB中的 Debug.Print ""
不是VC++中所有的东西都能转成VB。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 02:55

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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