請教大佬們,DLL是自己寫的,呼叫DLL的兩個函式時在一個main函式下的,一個函式有while(1),怎么用另一個函式終止它。舉個例子
創建呼叫函式:
/* Replace "dll.h" with the name of your header */
#include "dll.h"
#include <stdio.h>
#include <windows.h>
int flag = 1,i = 0;
//創建呼叫函式
DLLIMPORT void HelloWorld()
{
MessageBox(0,"Hello World from DLL!\n","Hi",MB_ICONINFORMATION);
while(flag)
{
i++;
}
}
//創建呼叫函式
DLLIMPORT void stopWhile()
{
flag = 0;
printf("123");
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
{
switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
{
break;
}
case DLL_PROCESS_DETACH:
{
break;
}
case DLL_THREAD_ATTACH:
{
break;
}
case DLL_THREAD_DETACH:
{
break;
}
}
/* Return TRUE on success, FALSE on failure */
return TRUE;
}
呼叫:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
typedef void (*FUNT)();
typedef void (*FUNC)();
HMODULE hMod = LoadLibrary("123.dll");
if(hMod != NULL)
{
//printf("%s\n","success!!!");
FUNT HelloWorld = (FUNT)GetProcAddress(hMod,"HelloWorld");
FUNT stopWhile = (FUNT)GetProcAddress(hMod,"sendData");
HelloWorld();
stopWhile();
}
}
怎么用stopWhile去終止Helloworld
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
FUNT stopWhile = (FUNT)GetProcAddress(hMod,"sendData");?dll匯出函式名稱代碼呢?來個sendData別人不知道是不是stopWhile
uj5u.com熱心網友回復:
while中加上退出條件,在另一個函式里修改這個條件,使條件滿足退出while回圈;uj5u.com熱心網友回復:
C和C++ 完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.htmlC和C++ 演算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html
uj5u.com熱心網友回復:
我錯了 忘記修改了uj5u.com熱心網友回復:
但是程式運行不到下一個函式呀uj5u.com熱心網友回復:
單執行緒你沒機會結束它。多執行緒可以用信號量uj5u.com熱心網友回復:
你的代碼會一直執行Helloworld,根本就走不到stop去
不要把作業放在主執行緒,放到作業執行緒中去,這樣才有機會去執行stop
uj5u.com熱心網友回復:
起個執行緒來呼叫HelloWorld() 啊,這樣就能往下走 呼叫stopWhile();uj5u.com熱心網友回復:
問題就是while(1)放子執行緒中的話主執行緒不是也要加while(1),不然主執行緒結束子執行緒也沒了uj5u.com熱心網友回復:
了解一下win32gui程式的構造uj5u.com熱心網友回復:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include <io.h>
#include <process.h>
CRITICAL_SECTION cs_log;
int No_Loop=0;
typedef void (*FUNT)();
FUNT HelloWorld;
FUNT stopWhile;
void testThread(void *pcn) {
int n,i;
n=(int)pcn;
i=0;
while (1) {
sleep_ms(1000);
EnterCriticalSection(&cs_log);
printf("in testThread %d:i==%ds\n",n,++i);
LeaveCriticalSection(&cs_log);
if (i>=5) {
No_Loop=1;
stopWhile();
}
}
}
int main(int argc,char * argv[]) {
HMODULE hMod = LoadLibrary("123.dll");
if(hMod == NULL) return 1;
HelloWorld = (FUNT)GetProcAddress(hMod,"HelloWorld");
stopWhile = (FUNT)GetProcAddress(hMod,"stopWhile");
InitializeCriticalSection(&cs_log);
int i;
_beginthread((void(__cdecl *)(void *))testThread,0,(void *)1);
i=0;
while (1) {
Sleep(100);
EnterCriticalSection(&cs_log);
printf("in main:i==%d\n",++i);
LeaveCriticalSection(&cs_log);
HelloWorld();
if (No_Loop==1) break;//
}
DeleteCriticalSection(&cs_log);
return 0;
}
}
uj5u.com熱心網友回復:
上貼代碼最后多了一個}uj5u.com熱心網友回復:
嘻,這還不簡單。在函式 HelloWorld 中創建一個執行緒(用POSIX執行緒或者Windows執行緒都行),把原先的代碼:
MessageBox(0,"Hello World from DLL!\n","Hi",MB_ICONINFORMATION);
while(flag)
{
i++;
}
作為執行緒代碼,放到執行緒函式中。
要使用專門的執行緒線束函式,不要使用默認的,或者return來結束。不然的話整個行程會提前結束,而不是等待最后一個執行緒結束后才結束。
uj5u.com熱心網友回復:
Talk is cheap, show me the code.uj5u.com熱心網友回復:
趙老濕這是考我吶?你等一下我這就來。
uj5u.com熱心網友回復:
首先是主程式檔案 main.c。這個檔案很普通,在內容上沒有什么特別之處,沒有平臺特征,先上這個檔案的內容:# include <stdio.h>
# include <stdlib.h>
# include <windows.h>
int main (int argc, char * argv [])
{
typedef void (*FUNT) (void);
typedef void (*FUNC) (void);
HMODULE hMod = LoadLibrary ("hellowd.dll");
if (hMod != NULL)
{
FUNT HelloWorld = (FUNT) GetProcAddress (hMod, "HelloWorld");
FUNT stopWhile = (FUNT) GetProcAddress (hMod, "stopWhile");
HelloWorld ();
stopWhile ();
}
getchar ();
}
唯一需要說明的是,最后的getchar用來使主執行緒(main執行緒)最后結束。其實際效果是等待DLL中的執行緒結束。
uj5u.com熱心網友回復:
接下來是元件的原始碼。在元件中,使用了多執行緒特性,而且用的是C標準庫提供的執行緒函式(從C11開始引入了多執行緒特征)。但遺憾的是,多數編譯器不支持C標準的多執行緒特性(包括它的頭<threads.h>),除了 Pelles C 這個可愛的編譯器。因為其簡單,我們先用Pelles C來創建和生成這個元件。以下是該元件的原始碼:/*我用的是C標準的多執行緒支持特性,而不是POSIX和WIN32多執行緒。
**目前只有Pelles C支持C11標準的多執行緒,所以用了Pelles C。
*/
# include <stdio.h>
# include <windows.h>
# include <threads.h>
# define _HELLOWD_
# include "hellowd.h"
BOOL APIENTRY DllMain (HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH://各分支內容從略
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
int flag = 1, i = 0;
int thrd_proc (void * arg)
{
MessageBox (0,"Hello World from DLL!","Hi", MB_ICONINFORMATION);
while (flag)
{
i++;
}
MessageBox (0, "The LOOP has been broken!", "Hi", MB_ICONINFORMATION);
printf ("The LOOP has been broken!\n");
return 0;
}
HELLOWDAPI void HelloWorld (void)
{
thrd_t t;
thrd_create (& t, thrd_proc, NULL);
thrd_detach (t);
}
HELLOWDAPI void stopWhile (void)
{
flag = 0;
printf("flag = 0.\n");
}
說明一下:匯出函式HelloWorld用來創建一個執行緒,執行緒啟動函式是thrd_proc。執行緒函式顯示資訊,并進入一個無限回圈,除非變數flag的值為0。當回圈退出后,再用兩種方法顯示“回圈已經退出”的資訊,并自動結束。顯然,這個函式的執行是異步的,創建執行緒后立即回傳主程式接著執行,同時執行緒也開始并行執行。
匯出函式stopWhile用來將變數flag的值設定為0,這樣就可以結束上面那個執行緒內的回圈。設定變數后,顯示一條資訊“flag = 0.\n”。
趙4老濕可能不會用Pelles C,沒有關系,我可以為你做一個POSIX或者WIN32版本的元件,這都可以的,No problem。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/280753.html
標籤:C語言
上一篇:求,哪個人可以幫幫我
下一篇:C入門學習
