aardio 官方社区

用户名  找回密码
 注册会员

QQ登录

只需一步,快速开始

帖子
查看: 7368|回复: 3

API调用,VARIANT怎么处理

[复制链接]

1

主题

7

回帖

92

积分

一级会员

积分
92
发表于 2014-1-5 12:12:05 | 显示全部楼层 |阅读模式
这几周都在沉迷于aardio,也尝试用她来实现各种功能,经查看相关例子和手册最后都能实现了,唯有VARIANT,这个比较麻烦。在网上查到VARIANT是个结构体(参考 http://www.newxing.com/Tech/Program/Cpp/VARIANT_556.html),但这个结构体还是比较麻烦的,结构体中包含联合体,联合体内又嵌套结构体,而且里面还有IUnknown、IDispatch、SAFEARRAY 等指针,我尝试用aardio实现这样的结构体,但本人学业不精,无法实现。
aardio里有这样现成的结构体或替代体吗,比如c#中使用object,vb中使用Variant,ole中用COleVariant等,这样都可以方便使用。
api原型:
int ReadItem(INT itemHandle,VARIANT *value);

在aardio中这样定义:
ReadItem=dll.api("ReadItem","int(INT itemHandle,struct &value)");

ReadItem=dll.api("ReadItem","int(INT itemHandle,pointer &value)");
都可以成功调用,但返回值value不知道怎么转换,请高手指点,谢谢!

5

主题

429

回帖

2420

积分

五级会员

积分
2420
发表于 2014-1-6 09:39:48 | 显示全部楼层
类型声明为pointer ,参数传入 com.Variant() 指针。
如果声明为struct,应传入结构体,结构体类型转换参考帮助手册: API数据类型

示例:

  1. import vc6;

  2. var vc = vc6( "/",, import console )  

  3. vc.cpp = /******
  4.         #include <windows.h>
  5.         #include <OaIdl.h>  
  6.          
  7.         extern "C" __declspec(dllexport) double  __cdecl TestVARIANT( VARIANT *v )  
  8.         {  
  9.                 return v->dblVal;
  10.         }
  11. ******/

  12. //编译生成DLL
  13. vc.exec(
  14.         'cl *.cpp'
  15.         ,'/W3'  
  16.         ,'/MD'
  17.         ,'/O2 /Ot /GL /EHsc'
  18.         ,'/D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL"'  
  19.         ,'/I"./INCLUDE"'
  20.         ,'kernel32.lib user32.lib'  
  21.         ,'/link /SUBSYSTEM:WINDOWS /MACHINE:X86'  
  22.         ,'/out:test.dll' ,'/dll'  
  23.         ,'/LIBPATH:".\LIB" /LIBPATH:".\LIB2"'
  24. )

  25. var dll = raw.loadDll("test.dll")
  26. TestVARIANT = dll.api("TestVARIANT","double(pointer b)" ,"cdecl")

  27. import com;
  28. import console
  29. console.printf( TestVARIANT(com.Variant( 123.5 ) ) )
复制代码

5

主题

429

回帖

2420

积分

五级会员

积分
2420
发表于 2014-1-6 09:46:10 | 显示全部楼层
一般提供VARIANT参数API的对象会支持IDispach接口,可以自动转换数据类型,不需要去声明API。
所以 VARIANT指针 在aardio里作用不大,仔细去看看接口文档,是否支持 com.CreateObject() 或 com.QueryObject() 直接转换为aardio对象

1

主题

7

回帖

92

积分

一级会员

积分
92
 楼主| 发表于 2014-1-9 15:21:00 | 显示全部楼层
本帖最后由 pw33 于 2014-1-11 11:42 编辑
神码 发表于 2014-1-6 09:46
一般提供VARIANT参数API的对象会支持IDispach接口,可以自动转换数据类型,不需要去声明API。
所以 VARIAN ...


谢谢高手指点,找到自动化接口了
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|aardio.com|aardio 官方社区 ( 皖ICP备09012014号 )

GMT+8, 2025-6-16 07:20 , Processed in 0.066009 second(s), 25 queries .

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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