能力值:
( LV2,RANK:10 )
2 楼
先支持下!
能力值:
( LV2,RANK:10 )
3 楼
你这个号买邀请码就好了。。。
能力值:
( LV2,RANK:10 )
4 楼
我觉得你说得非常有道理!
编辑:擦!本来还想删掉那个用这个再发一次,发现pediy论坛不能删自己的帖。
好吧那也不敢再用这个发一次了……
能力值:
( LV6,RANK:80 )
5 楼
说,头发上的水滴是怎么回事。
能力值:
( LV12,RANK:980 )
6 楼
测试了一下,没有成功。不知是不是我的方法不对。请楼主写个例子测试一下。
能力值:
( LV2,RANK:10 )
7 楼
好,比如你有一个这样的doadd.c文件,内容是
__declspec(dllexport) int __stdcall add(int a, int b) { return a + b; }
用gcc编译,
gcc -s -odoadd.dll -shared doadd.c
得到doadd.dll,导出的函数名是 add@8
然后你有一个这样的calladd.c文件,内容是
int __stdcall add(int, int);
#include <stdio.h>
int main() {
printf("%d\n", add(10, 20));
return 0;
}
编译的时候add用导入库的方式链接,所以需要一个vc能用的导入库。
此时需要导入的函数名是 add@8,链接的时候需要的符号是 _add@8
写一个这样的xml:
<ImportLibrary>
<DllName>doadd.dll</DllName>
<Import>
<LinkName>__imp__add@8</LinkName>
<StubName>_add@8</StubName>
<ImportName>add@8</ImportName>
</Import>
</ImportLibrary>
保存成doadd.xml,用这个工具
MakeImpLib doadd.xml doadd.lib
得到一个doadd.lib文件,然后用vc编译calladd.c
cl calladd.c doadd.lib
得到调用doadd.dll进行加法计算然后显示结果的calladd.exe
p.s. 甚至能支持汉字函数名哦,
<?xml version="1.0" encoding="UTF-8"?>
<ImportLibrary>
<DllName>doadd.dll</DllName>
<Import>
<LinkName>__imp__add@8</LinkName>
<StubName>_加法@8</StubName>
<ImportName>add@8</ImportName>
</Import>
</ImportLibrary>
然后
int __stdcall 加法(int, int);
#include <stdio.h>
int main() {
printf("%d\n", 加法(10, 20));
return 0;
}
在VC2013下能正常XD
能力值:
( LV12,RANK:980 )
8 楼
谢谢回复。我拿一个现成的DLL来测试,用ImpLib-1.8生成的LIB能正常使用,而用你的工具生成时编译错误。
另外,你的工具不能自动生成XML文件,手工写比较麻烦。
不好意思,挑剔了
能力值:
( LV2,RANK:10 )
9 楼
我的工具生成的编译时候出错误……具体是什么错误?
如果是无法解析的外部符号,那么是因为XML里给出的符号不正确。
可以使用 dumpbin.exe /symbols 查看生成的lib文件导出了什么符号。
如果是其他错误,比如说lib文件结构不正确、lib里的object文件结构有问题之类,希望报告一下,我好发现和修复bug。
我最早也是一直用implib sdk的,后来发现它有点局限性,之后决定自己做一个。
虽然他是开源的但是因为源代码实在是很难看懂,都是靠预编译来完成的,而且似乎有很多的重复代码,看起来实在头痛,加上对fasm汇编器的不熟悉,就放弃了对其源代码进行修改达到自己目的的途径,转为自己重新开发一套来满足这样的需求。
能力值:
( LV12,RANK:980 )
10 楼
你测试一下我上传的附件DLL,应该能重现问题。
上传的附件:
能力值:
( LV2,RANK:10 )
11 楼
我用OD看了一下,这个DLL里导出的两个函数都是没有参数的,而且还没有返回值,作为stdcall或者cdecl都行。我当作stdcall处理。
我可以从cpp代码生成exe文件,导入你的dll里的两个函数。
截图质量很差是在想大概可以给看雪省点附件空间(何?)
我想你应该没有误解这个工具的作用吧……它是生成导入库,就是vc生成dll的时候会配给你的那个lib,生成和那个功能一样的lib,供弄丢lib的人(或者网上下的dll没有lib,或者其他编译器生成的dll所以lib不能给vc用,等情况)开发时候使用,不是给exe的导入表添加导入项之类。
哦对了有个问题我还没解释就是为什么输入是xml,因为我发现解析输入文件很麻烦(锤锤锤)文件编码问题,之类之类。所以最后发现xml比较省事。如果需要其他前端的话,可以自己写一个,我的libgenhelper.dll的资源里可以拆出一个readme和两个头文件,然后coffgen.dll里可以拆出前两个头文件依赖的另一个头文件(这个你可以不看),提供的接口我觉得应该是非常简单了,作为生成lib文件用的后端自己配一个前端就好。
现在暂时没有太好的想法要把前端做成什么样,就先暂时用xml……
上传的附件: