[已解决]关于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不能传递数组参数啊 能不能传递还真没试过.但是好象有一点不对,"char*",dllcall没有char这种类型.char只在创建数据结构的时候出现 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, "排序后")
完整工程打包
附带一个以前写的vb call dll对结构体排序
LZ 的代码是想改变指针数组中各个指针元素的指向而不移动字符串本身吧{:face (303):} mingw版dll 新鲜出炉
回复 6# veket_linux
亲,你还缺金钱吗?每个附件都售卖! {:face (258):} {:face (370):} {:face (229):} 回复 7# chishingchan
我知道,这是针对我的!
我就不下载/{:face (303):} 不得不下载,我就是想知道mycompare这个自定义函数就是出来打酱油的吗? 回复 12# gto250
好吧,我错了,没看仔细,他就是一个回调函数。 回复 12# gto250
百度 qsort 的用法第4个参数
http://www.cnblogs.com/syxchina/archive/2010/07/29/2197382.html
页:
[1]