我有一个加载库的 Windows 可执行文件,我想创建一个 Winelib DLL 来覆盖 Windows DLL。 我已经搜索并尝试了两天,但没有成功!请帮助我!
基本上,我使用以下命令创建 mydll.c 和 mydll.spec 来构建 Winelib DLL:
winegcc -m32 -shared -o mydll.dll mydll.c mydll.spec
现在我有了 mydll.dll.so 并且我想覆盖 mydll.dll (两者都在同一个地方) 我应该怎么办 ?我尝试重命名 mydll.dll,但调用该函数时出现页面错误!我还尝试使用 winecfg 配置覆盖或设置 WINEDLLPATH 等环境变量。我不明白如何继续。
如何在 Windows 可执行文件中加载库
HINSTANCE DllHandle;
char str[255];
typedef int(__stdcall * tfp)(char * const);
DllHandle = LoadLibrary("mydll.dll");
tfp fp = (tfp)GetProcAddress(DllHandle, "myfunc");
fp(str);
FreeLibrary(DllHandle);
mydll.spec
@ stdcall myfunc(str)
mydll.c
#include <windef.h>
int WINAPI myfunc(char * str)
{
strcpy(str, "myfunc from the Winelib DLL");
return 0;
}
使用
WINEDEBUG=+module
调试 DLL 加载问题。
我不相信 Wine 会在单个文件夹之外搜索本机
.dll.so
文件,但代码位于 dlls/ntdll/loader.c:load_builtin_dll
(如果您想自行检查的话)。
我能够使其正常工作,但必须进行以下更改。
我在 Ubuntu 上使用 wine5,似乎默认安装是 64 位。 我必须先重命名 wine 的可执行文件,因为它错误地使用了 32 位调用,这意味着它无法与 64 位 dll 一起工作。
安装 wine-tools(用于 winegcc)
apt-get install wine-tools
修复 wine64(因为 exe 似乎加载 wine32 然后出错)
cd /usr/lib/wine
mv wine wine32
ln -s wine64 wine
生成文件
all: mydll.dll.so testmydll.exe
mydll.dll.so: mydll.c mydll.spec
winegcc -shared -o mydll.dll mydll.c mydll.spec
testmydll.exe: testmydll.c
winegcc -mno-cygwin -o testmydll testmydll.c
clean:
rm -f *.so
rm -f *.exe
rm -f *~
此外,您的代码中有一个错误,我已更正。缺少 __stdcall 和 DLL 的名称。
nV0ZSB0byBzZXQgdXAgeW91ciBwaG9uZSB3aXRoI
Edvb2dsZQ0KDQpHZXQgIAOKc3RhcnRl ZDxodHRwczovL25vdGlmaWNhdGlvbnMuZ29vZ2x1LmNvb S9nL3AvQU5pYW81cjc1YWxiZFdIZ1Qz NDVLVzJHWFBOUHRObUQ5ZnE1WjZDRkU3dOQ1UC1aZjVNV O0xd2N1VWpXLWVkb1BLUjU4Q25rVDVm eWIyckRuUlJ4WF9YM3AOWk5nbV83TFd5ekFrQOhwVVNSV XJSTWVRskN3RTVIZUtDeUFObDliXONV RUlnWFhURTFYS2doYkFwamREVzRoS1JPZzZuQ3Z2RON2T nQ0Vy1uMW100EdIOGtCbkdac25UN2da cOprd0d2ZG9GTHJPV2tNaXBtcExiaDdnNkpseEQ2YjRuS m9TQmZRWVFxbkRQTXFiSDhFZOs3T1F6 V3J3VmFwbOpmUXFIYXk2RkpVSFhqODFYLU1vVwhOUkpOc zk4ci11UjM1cO9fcjFScEdsbm93RGtf 0TA3dFFlLUhuRzFGb25mOGszWmU4aOd1bE5qSHV6QnEyV HJOWVZpSOV2TTMxTHJGbWNXcDdvTGxB RGRoQXRsaXRBMTd2b2M4VGFDV003eGxoeUlqX1BXdmU2T HEOT1AteU5sTjNPTDazd201Qm5IQOsz ZmNBRjJWYVFteVVjSGEzNFpmcW5IQW53cWVrUXJhMHl5U U1 3dXJCQS1DWmtpTUpvYzBYSETiTEFr VFJtOFVYETdNeEF4a0xpRmFENkMybndOMHBLS1BESWFaY mtCSG53RHRnNXdPM2NTU09iSOJ4OS13 TkJWclJoREhOSDNldUNpZjVQVU1faXNnUml3cGtKYnZ2X 1BpNGpKLXpsUmhRWDJXOTFQdHQyVzho NTVhNXQtYUT1bm8ya2xnZOkweFRqcnRmaTZ2Mzd1bGlST V9rbTM2MHdkNnoxNkR1SnJ1RkphWko1 V2NGYkx1WE5kcUpFbjRrSE53N3Zva1ROVVliNlFkcG9CL Td4aW5jSTirbVl6N1dUdGNUeERmbkut REdmZTBtQmJ6WmpmVmNPNFRsX3R2bXg2bmhiRGhkb3RpV lhGaldFUEJObUVUYXZLY1cOMEw4SlVM Y1B6WVBCdm9MOEcteWdITkxhWHkodXgxYOlrNWw+DQONC lRoaXMgZW1hawwgd2FzIHNlbnQgdG8g IAOKCGFOdGVyc29uYXNobGV5NzU1OEBnbWFpbC5jb208c GFOdGVyc29uYXNobGV5NzU1OEBnbWFp bC5jb20+IGJlY2F1c2UgeW91ICANmNyZWFOZWQgYSBHb 29nbGUgQWNjb3VudCBybiB5b3VyIEdh bGF4eSBTMjEgVWxOcmEgNUcgZGV2aWNlLiBJZiB5b3UgZ G8gbm90ICANCndpc2ggdG8gcmVjZWl2***
1.