找回密码
 加入
搜索
查看: 3207|回复: 13

[系统综合] [已解决]关于dllcall中参数为数组的问题

  [复制链接]
发表于 2016-6-9 12:52:40 | 显示全部楼层 |阅读模式
本帖最后由 gto250 于 2016-6-15 18:45 编辑

用c编写了一个dll动态链接库,用于字符串数组的排序,供给au3调用。
但是调用不成功。

C代码如下,用MinGW编译
sort.c
#include <stdio.h>


__declspec(dllexport) void _stdcall sort(char* str[],int size);



void _stdcall sort(char* str[],int size)
{
int i,j;
char *tmp;
for (i=0;i<size ;i++ )
{
for (j=i+1; j<size;j++ )
{
if (strcmp(str,str[j])>0)
{
        tmp=str;
        str=str[j];
        str[j]=tmp;
}
}
}
}

au3代码如下:
dim $a[5]=["我的","a de","啊的","zh","什么"]
$c=DllCall("sort.dll","none","sort","char*",$a,"int",5)
msgbox(0,"",$a[1])

是不是dllcall不能传递数组参数啊
发表于 2016-6-10 09:18:33 | 显示全部楼层
能不能传递还真没试过.但是好象有一点不对,"char*",dllcall没有char这种类型.char只在创建数据结构的时候出现
发表于 2016-6-10 14:59:49 | 显示全部楼层
vc写dll vb au3 call  注意用dumpbin 查看dll内实际函数名

#include <windows.h>
#include <stdlib.h>
#include <string.h>
_declspec(dllexport) void __stdcall sort(char *str[], int size, int linesize);

#include "vcdll.h"
int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
        return TRUE;
}
int mycompare (const void * a, const void * b)
{
        return strcmp((char *)a, (char *)b);
}
_declspec(dllexport) void __stdcall sort(char *str[], int size, int linesize)
{
        qsort(str, size, linesize, mycompare);
        MessageBox(NULL, "DllCallSortFinsh","", MB_OK);
}


#Include <Array.au3>
Dim $str_arr[5]=["我的","a de","啊的","zh","什么"]
Dim $str_st
Dim $i
Dim $array_size
$str_st = ""
$array_size = UBound($str_arr)

For $i = 1 To $array_size
        $str_st &= "char s" & $i & "[256];"
Next
#cs
C 定义结构体变量st
struct {
        char s1[256];
        char s2[256];
        char s3[256];
        char s4[256];
        char s5[256];
}st;
#ce
Dim $st = DllStructCreate($str_st)

Dim $asc_arr
Dim $j
For $i = 1 To $array_size
        $asc_arr = StringToASCIIArray($str_arr[$i-1], 0, StringLen($str_arr[$i-1]), 1)

        For $j = 0 To UBound($asc_arr)-1
                DllStructSetData($st, "s" & $i,$asc_arr[$j], $j+1)
        Next
        DllStructSetData($st, "s" & $i, Chr(0), $j+1)
Next

ConsoleWrite("排序前:" & @CRLF)
For $i = 1 To $array_size
           $str_arr[$i-1] = DllStructGetData($st, "s" & $i)
        ConsoleWrite( $str_arr[$i-1] & @CRLF)
Next
_ArrayDisplay($str_arr, "排序前")
DllCall("vcdll.dll", "none", "_sort@12", "long", DllStructGetPtr($st), "long", $array_size, "long",256)
ConsoleWrite(">>>排序后:" & @CRLF)
For $i = 1 To $array_size
           $str_arr[$i-1] = DllStructGetData($st, "s" & $i)
           ConsoleWrite( $str_arr[$i-1] & @CRLF)
Next
_ArrayDisplay($str_arr, "排序后")

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 2金钱 +110 收起 理由
gto250 + 100 谢谢
nmgwddj + 10 很好的一个例子

查看全部评分

发表于 2016-6-10 15:04:27 | 显示全部楼层

完整工程打包
附带一个以前写的vb call dll  对结构体排序

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2016-6-10 15:07:42 | 显示全部楼层
LZ 的代码是想改变指针数组中各个指针元素的指向而不移动字符串本身吧
发表于 2016-6-10 15:24:53 | 显示全部楼层
mingw版dll 新鲜出炉

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2016-6-11 08:08:59 | 显示全部楼层
回复 6# veket_linux


    亲,你还缺金钱吗?每个附件都售卖!
发表于 2016-6-11 13:24:56 | 显示全部楼层
发表于 2016-6-11 16:44:08 | 显示全部楼层
发表于 2016-6-14 22:37:18 | 显示全部楼层
 楼主| 发表于 2016-6-15 18:28:52 | 显示全部楼层
回复 7# chishingchan


    我知道,这是针对我的!
我就不下载/
 楼主| 发表于 2016-6-15 18:40:40 | 显示全部楼层
不得不下载,我就是想知道mycompare这个自定义函数就是出来打酱油的吗?
 楼主| 发表于 2016-6-15 18:44:41 | 显示全部楼层
回复 12# gto250


    好吧,我错了,没看仔细,他就是一个回调函数。
发表于 2016-6-15 18:49:22 | 显示全部楼层
回复 12# gto250


    百度   qsort 的用法  第4个参数

http://www.cnblogs.com/syxchina/archive/2010/07/29/2197382.html
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-3 15:38 , Processed in 0.088053 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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