一個C++DLL里面需要傳入一個Delphi的回呼函式,回傳一個字串作為處理結果,但是在多執行緒并發的情況下,回呼函式里面的回傳值會不一致,請問這是為什么?麻煩給個解決的思路。
C++ DLL的代碼:
#include <stdio.h>
#include <stdlib.h>
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
#include <process.h>
typedef void (CALLBACK *DoDisptchCmd)(const char* name, char*& callback);
DoDisptchCmd disptcher = NULL;
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
unsigned __stdcall SecondThreadFunc( void* pArguments )
{
char* callback = NULL;
disptcher("1", callback);
printf("CALL1=======Address: %d, Content: %s\n", (int)&callback, callback);
if (strcmp(callback, "nihao") != 0)
printf("ERROR CALL1=======Address: %d, Content: %s\n", (int)&callback, callback);
return 0;
}
unsigned __stdcall SecondThreadFunc1( void* pArguments )
{
char* callback = NULL;
disptcher("2", callback);
printf("CALL2=======Address: %d, Content: %s\n", (int)&callback, callback);
if (strcmp(callback, "nihao2") != 0)
printf("ERROR CALL2=======Address: %d, Content: %s\n", (int)&callback, callback);
return 0;
}
unsigned __stdcall SecondThreadFunc2( void* pArguments )
{
char* callback = NULL;
disptcher("3", callback);
printf("CALL3=======Address: %d, Content: %s\n", (int)&callback, callback);
if (strcmp(callback, "nihao3") != 0)
printf("ERROR CALL3=======Address: %d, Content: %s\n", (int)&callback, callback);
return 0;
}
void WINAPI Start()
{
while (true)
{
HANDLE hThread;
unsigned threadID;
hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID );
HANDLE hThread1;
unsigned threadID1;
hThread1 = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc1, NULL, 0, &threadID1 );
HANDLE hThread2;
unsigned threadID2;
hThread2 = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc2, NULL, 0, &threadID2 );
Sleep(10);
}
}
void WINAPI Register(DoDisptchCmd callback)
{
disptcher = callback;
}
DELPHI的代碼:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
TDODISPTCHCMDCB = procedure(const name: PAnsiChar; var Callback: PAnsiChar); stdcall;
function TestAdd(I, J: Integer): HRESULT; stdcall;
external 'Test.dll' name 'TestAdd';
procedure RegisterCallback(callback: TDODISPTCHCMDCB); stdcall;
external 'Test.dll' name 'Register';
procedure Start(); stdcall;
external 'Test.dll' name 'Start';
procedure CallbackFunction(url: PAnsiChar; var callback: PAnsiChar); stdcall;
var
Content: string;
begin
if (url = '1') then
Content := 'nihao'
else if (url = '2') then
Content := 'nihao2'
else if (url = '3') then
Content := 'nihao3';
callback := PAnsiChar(AnsiString(Content));
end;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
RegisterCallback(@CallbackFunction);
Start();
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
結果:
CALL1=======Address: 38666040, Content: nihao
CALL2=======Address: 39714616, Content: nihao2
ERROR CALL2=======Address: 39714616, Content: nihao3
CALL3=======Address: 40763192, Content: nihao3
ERROR CALL1=======Address: 38666040, Content: nihao3
CALL1=======Address: 38666040, Content: nihao
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/60288.html
標籤:語言基礎/算法/系統設計
