gto250 发表于 2016-6-9 12:52:40

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

本帖最后由 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)>0)
{
      tmp=str;
      str=str;
      str=tmp;
}
}
}
}

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

是不是dllcall不能传递数组参数啊

tubaba 发表于 2016-6-10 09:18:33

能不能传递还真没试过.但是好象有一点不对,"char*",dllcall没有char这种类型.char只在创建数据结构的时候出现

veket_linux 发表于 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=["我的","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 & ";"
Next
#cs
C 定义结构体变量st
struct {
        char s1;
        char s2;
        char s3;
        char s4;
        char s5;
}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, "排序后")

veket_linux 发表于 2016-6-10 15:04:27


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

veket_linux 发表于 2016-6-10 15:07:42

LZ 的代码是想改变指针数组中各个指针元素的指向而不移动字符串本身吧{:face (303):}

veket_linux 发表于 2016-6-10 15:24:53

mingw版dll 新鲜出炉

chishingchan 发表于 2016-6-11 08:08:59

回复 6# veket_linux


    亲,你还缺金钱吗?每个附件都售卖!

wei999 发表于 2016-6-11 13:24:56

{:face (258):}

ddrs 发表于 2016-6-11 16:44:08

{:face (370):}

ilvjyw 发表于 2016-6-14 22:37:18

{:face (229):}

gto250 发表于 2016-6-15 18:28:52

回复 7# chishingchan


    我知道,这是针对我的!
我就不下载/{:face (303):}

gto250 发表于 2016-6-15 18:40:40

不得不下载,我就是想知道mycompare这个自定义函数就是出来打酱油的吗?

gto250 发表于 2016-6-15 18:44:41

回复 12# gto250


    好吧,我错了,没看仔细,他就是一个回调函数。

veket_linux 发表于 2016-6-15 18:49:22

回复 12# gto250


    百度   qsort 的用法第4个参数

http://www.cnblogs.com/syxchina/archive/2010/07/29/2197382.html
页: [1]
查看完整版本: [已解决]关于dllcall中参数为数组的问题