我的DLL中有一个传递字符串的函数,代码如下:
void StrPassed(HWND hwnd, char* str) //此种方法调用没有问题
{
if (hwnd)
SetForegroundWindow(hwnd);
DWORD FormThreadID = GetCurrentThreadId();
DWORD CWndThreadID = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
// 附加输入线程
AttachThreadInput(CWndThreadID, FormThreadID, true);
HWND hWnd = GetFocus(); // 得到当前键盘光标所在的窗口
AttachThreadInput(CWndThreadID, FormThreadID, false); // 取消 for (unsigned int i = 0; i < strlen(str); i++)
{
SendMessage(hWnd, WM_CHAR, (LPARAM)(str[i] & 0xFF), 0);
}
}void StrPassedEx(char* str) //此种方法调用主程序会退出
{
//HWND hWnd = GetForegroundWindow();
StrPassed(NULL, str);
}用Delphi调用这个DLL,第一种方法调用没有问题,但是第二种方法调用则会使主程序退出。大家知道是什么原因吗?是因为线程冲突吗?
void StrPassed(HWND hwnd, char* str) //此种方法调用没有问题
{
if (hwnd)
SetForegroundWindow(hwnd);
DWORD FormThreadID = GetCurrentThreadId();
DWORD CWndThreadID = GetWindowThreadProcessId(GetForegroundWindow(), NULL);
// 附加输入线程
AttachThreadInput(CWndThreadID, FormThreadID, true);
HWND hWnd = GetFocus(); // 得到当前键盘光标所在的窗口
AttachThreadInput(CWndThreadID, FormThreadID, false); // 取消 for (unsigned int i = 0; i < strlen(str); i++)
{
SendMessage(hWnd, WM_CHAR, (LPARAM)(str[i] & 0xFF), 0);
}
}void StrPassedEx(char* str) //此种方法调用主程序会退出
{
//HWND hWnd = GetForegroundWindow();
StrPassed(NULL, str);
}用Delphi调用这个DLL,第一种方法调用没有问题,但是第二种方法调用则会使主程序退出。大家知道是什么原因吗?是因为线程冲突吗?
void StrPassedEx(char* str)
这个默认是cdecl约定,当然也可以在工程属性里调整。
void CALLBACK StrPassedEx(char* str)
这个就是stdcall约定,CALLBACK = WINAPI = stdcall。申明和实现都要用上这个标记。
push v3
push v2
push v1mov eax
mov ebx
...