我的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,第一种方法调用没有问题,但是第二种方法调用则会使主程序退出。大家知道是什么原因吗?是因为线程冲突吗?

解决方案 »

  1.   

     StrPassed(NULL, str);这一句有问题。你窗口都没有,WM_CHAR发给谁啊??
      

  2.   

    调用不是我做的,是别人用Delphi调用的
      

  3.   

    你给Delphi调用的函数要声明为stdcall才行,通常情况下它不支持cdecl约定,除非用内嵌汇编的方式。
      

  4.   

    楼上的,这是什么意思?我以前没给Delphi做过DLL,不太明白。麻烦你给解释一下或给个例子、方向。非常感谢
      

  5.   


    void StrPassedEx(char* str)
    这个默认是cdecl约定,当然也可以在工程属性里调整。
    void CALLBACK StrPassedEx(char* str)
    这个就是stdcall约定,CALLBACK = WINAPI = stdcall。申明和实现都要用上这个标记。
      

  6.   

    是不是第一个函数不需要加CALLBACK,只要第二个函数加就可以了
      

  7.   

    调用方式不一样的……
    push v3
    push v2
    push v1mov eax
    mov ebx
    ...