免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3614 | 回复: 2
打印 上一主题 下一主题

求助:perl 调用C的DLL问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-14 16:17 |只看该作者 |倒序浏览
dll 中函数
float add (float a, float b)
{
       return a + b;
}


perl 调用此函数时, 总是出错, 打印不出结果。

而变成整型的dll 函数
int add (int a, int b)
{
       return a + b;
}
调用没问题。

调用的参数设置没问题。

谢谢指点。

论坛徽章:
0
2 [报告]
发表于 2009-07-15 10:23 |只看该作者
float好像不是XS支持的?

还是说要在里面return (float)(a + b)

还是说在typemap里要定义一下?

论坛徽章:
0
3 [报告]
发表于 2009-07-16 11:02 |只看该作者
我的dll头文件定义如下:
// MY_API.h
#ifndef  __MYAPI_H_H_
#define __MYAPI_H_H_

#ifdef MY_EXPORTS
#define MY_API __declspec(dllexport)
#else
#define MY_API __declspec(dllimport)
#endif

MY_API float __stdcall add_f(float a, float b);

#endif //__MYAPI_H_H_


实现文件
// MY_API.cpp

#include "stdafx.h"
#include "MY_API.h"

MY_API float __stdcall add_f(float a, float b)
{
     return (float)(a + b);
}

.def 文件
// MY_API.def
LIBRARY "MY_API"
EXPORTS
    add_f


// perl 中调用此dll为:

#! /usr/bin/perl -w
use Win32::API;

$test_dll = 'E:\perl\MY_API.dll';
die "can't find MY_API.dll \n"  unless -e $test_dll;

$add_f = new Win32::API($test_dll, "float add_f(float a, float b)");
if (not defined $add)
{
    die "Can't import API add_f: $!\n";
}
$sum = 0.0;
$sum = $add_f->Call(3.2, 2.5);    #执行此语句后程序崩溃,
                                             #提示: Perl Command Interpreter has encountered a problem and needs to close.
                                             #We are sorroy for the inconvenience.

print "$sum\n";



请高手指点指点啊,
如果把float 换成 int 的调用没有问题。
就是perl如果调用的dll中函数,如果函数含有float* 参数, 或者是返回float 类型的,调用就会出错。
谢谢帮忙啊。急急急。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP