找回密码
 点一下
楼主: Soar

自制新版jAPI,兼容1.20e/1.21b/1.22(附带源代码)

[复制链接]
发表于 2009-3-3 16:39:24 | 显示全部楼层
还有,37楼的【我用global function组建对魔兽的接口函数(前面加jNATIVE),能用不加jNATIVE的class方法吗?】
是说这样:
[codes=C++]class CC
{
    CC(int i){ std::cout << i; }
};

jInt jNATIVE Cout( jInt ji )
{
    CC * pc = new CC( ji );
    delete pc;
    pc = 0;
}[/codes]
会不会崩溃或出现其他问题?
回复

使用道具 举报

发表于 2009-3-3 17:09:24 | 显示全部楼层
引用第39楼血戮魔动冰于2009-03-03 16:35发表的  :
还有,为什么我用Dev-C++和VC这行都报错呢?
[codes=C++]typedef void    (jAPI *jpAddNative)(void *routine, char *name, char *prototype);
typedef jString (jAPI **jpStrMap)    (char *str);
typedef char *    (jAPI **jpStrGet)    (jString strid);[/codes]
怎么改?

应该是
typedef jString (jAPI *jpStrMap) (char *str);
typedef char* (jAPI *jpStrGet) (jString strid);

还有,这些你加了没?

#define jNATIVE _cdecl
#define jAPI _fastcall

typedef long jString;
typedef long jInt;
typedef long jReal;
引用第40楼血戮魔动冰于2009-03-03 16:39发表的  :
还有,37楼的【我用global function组建对魔兽的接口函数(前面加jNATIVE),能用不加jNATIVE的class方法吗?】
是说这样:
[codes=C++]class CC
{
&#160; &#160; CC(int i){ std::cout << i; }
.......

应该可以
回复

使用道具 举报

发表于 2009-3-3 17:20:51 | 显示全部楼层
【还有,这些你加了没?

#define jNATIVE _cdecl
#define jAPI _fastcall

typedef long jString;
typedef long jInt;
typedef long jReal; 】
这些已经加了,而且
typedef jString (jAPI *jpStrMap) (char *str);
typedef char* (jAPI *jpStrGet) (jString strid);
这个也改了,可还是报错:
【parse error before `*】
是什么意思?
回复

使用道具 举报

 楼主| 发表于 2009-3-3 17:36:29 | 显示全部楼层
回楼上,__cdecl和__fastcall前面都是两个下划线
另外别用Dev-C++了,现在有替代品了:
http://www.codeblocks.org
回复

使用道具 举报

发表于 2009-3-3 21:15:41 | 显示全部楼层
引用第42楼血戮魔动冰于2009-03-03 17:20发表的&#160; :
【还有,这些你加了没?

#define jNATIVE _cdecl
#define jAPI _fastcall

.......


用filio.cpp稍作修改,可以用VC编译了,附VC6.0的工程文件 JassFile.zip (3 KB, 下载次数: 11)
回复

使用道具 举报

发表于 2009-3-4 13:05:04 | 显示全部楼层
引用第43楼Soar于2009-03-03 17:36发表的  :
回楼上,__cdecl和__fastcall前面都是两个下划线
另外别用Dev-C++了,现在有替代品了:
http://www.codeblocks.org
我不懂E文。
回复

使用道具 举报

发表于 2009-3-4 13:07:04 | 显示全部楼层
回44楼,谢。
还有,如何测试自己的地图?
我用的是WEHelper。
能不能有个1.2.3.4…………的步骤?
每次我试,总是在冰封王座默认窗口(就是魔兽一开始的窗口)
回复

使用道具 举报

 楼主| 发表于 2009-3-4 13:49:58 | 显示全部楼层
忘了放Loader的源代码:
  1. #include <windows.h>
  2. #include <tchar.h>
  3. VOID nLoadModule(LPCSTR libName, LPCSTR szCmdLine)
  4. {
  5.     char cmdline[512];
  6.     wsprintfA(cmdline, "war3.exe %s", szCmdLine);
  7.     STARTUPINFOA si = {0};
  8.     si.cb = sizeof(si);
  9.     PROCESS_INFORMATION pi = {0};
  10.     if(!CreateProcessA(NULL, cmdline, NULL, NULL, TRUE, CREATE_SUSPENDED, NULL, NULL, &si, &pi))
  11.         return;
  12.     HANDLE hProcess = pi.hProcess;
  13.     DWORD dwSize, dwWritten;
  14.     dwSize = lstrlenA( libName ) + 1;
  15.     LPVOID lpBuf = VirtualAllocEx( hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE );
  16.     if ( NULL == lpBuf )
  17.     {
  18.         CloseHandle( hProcess );
  19.         return;
  20.     }
  21.     if ( !WriteProcessMemory( hProcess, lpBuf, (LPVOID)libName, dwSize, &dwWritten ) || dwWritten != dwSize )
  22.     {
  23.         VirtualFreeEx( hProcess, lpBuf, dwSize, MEM_DECOMMIT );
  24.         CloseHandle( hProcess );
  25.         return;
  26.     }
  27.     DWORD dwID;
  28.     HMODULE hmod = LoadLibraryW(L"Kernel32");
  29.     LPTHREAD_START_ROUTINE pFnLoadLib = (LPTHREAD_START_ROUTINE)GetProcAddress(hmod, "LoadLibraryA");
  30.     typedef HANDLE (WINAPI *CreateRemoteThread_t)(HANDLE hProcess, LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);
  31.     CreateRemoteThread_t CreateRemoteThread = (CreateRemoteThread_t)GetProcAddress(hmod, "CreateRemoteThread");
  32.     HANDLE hThread = CreateRemoteThread( hProcess, NULL, 0, pFnLoadLib, lpBuf, 0, &dwID );
  33.     WaitForSingleObject( hThread, INFINITE );
  34.     ResumeThread(pi.hThread);
  35.     CloseHandle( hThread );
  36.     CloseHandle( hProcess );
  37. }
  38. BOOL GrantPrivilege()
  39. {
  40.     TOKEN_PRIVILEGES tkp;
  41.     HANDLE hToken;
  42.     if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
  43.         return FALSE;
  44.     LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid);  tkp.PrivilegeCount = 1;
  45.     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  46.     AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
  47.     return TRUE;
  48. }
  49. extern "C"
  50. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  51. {
  52.     if(!GrantPrivilege())
  53.     {
  54.         MessageBox(NULL, _T("Failed to grant privilege, please confirm your account."), _T("Error"), 0);
  55.         return -1;
  56.     }
  57.     nLoadModule("japi.dll", lpCmdLine);
  58.     return 0;
  59. }
复制代码
如果要引导worldedit.exe只要把源代码里的war3.exe改成worldedit.exe即可
回复

使用道具 举报

发表于 2009-3-4 16:31:12 | 显示全部楼层
我还是不懂如何测试~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-20 10:38 , Processed in 0.118655 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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