Win 32 dllプログラミング簡易記録

4127 ワード

1.関数定義
win 32ダイナミックリンクライブラリのヘッダファイルには以下の定義があり、各インタフェース関数の定義前にXXX_が加算されます.API
XXX_はプロバイダで事前定義されています.EXPORTS、dllexport、dllimportは、コンパイラにエクスポートとインポートを通知します.
extern“C”はコンパイラに教えて、関数はCコンパイラのリンクの方式を通じてリンクして、CはリロードしてC++リンクの名前のフォーマットと異なっていません
#ifdef XXX_EXPORTS
#define XXX_API extern "C"__declspec(dllexport)
#else
#define XXX_API extern "C"__declspec(dllimport)
#endif
2.関数タイプ
__stdcallはパラメータスタックの伝達方向とスタッククリーンアップ者を定義します
typedef unsigned int (__stdcall *XXX)(void *data, unsigned int index);
3.マルチスレッド
DWORD WINAPI ThreadProc(LPVOID lpParam);
HANDLE thd = CreateThread(NULL, 0, ThreadProc, ¶, 0, NULL);
CloseHandle(thd);
最初のパラメータはスレッドカーネルオブジェクトのセキュリティ属性を表し、一般的にNULLに入力するとデフォルト設定が使用されます.
2番目のパラメータはスレッドスタックの空間サイズを表し、入力0はデフォルトサイズ(1 MB)を使用することを示します.
3番目のパラメータは、新しいスレッドが実行するスレッド関数アドレスを表し、複数のスレッドが同じ関数アドレスを使用できる
4番目のパラメータはスレッド関数に渡されるパラメータです
5番目のパラメータは、CREATE_の場合、スレッドの作成を制御する追加のフラグを指定します.0は、スレッドが作成された直後にスケジュールできることを示します.SUSPENDEDはスレッド作成後に運転を一時停止することを示し、ResumeThread()が呼び出されるまでスケジューリングできません.
6番目のパラメータはスレッドのID番号を返します.NULLに入力すると、そのスレッドID番号を返す必要がないことを示します.
関数の戻り値:新しいスレッドのハンドルが正常に返され、NULLが返されませんでした
4.信号量
HANDLE semaphore = CreateSemaphore(NULL, 0, 1, NULL);
if(WAIT_TIMEOUT == WaitForSingleObject(semaphore, 2000)){}
指定した時間内にオブジェクトがトリガーされ、関数はWAIT_を返します.OBJECT_0が最大待ち時間を超えたオブジェクトは、まだWAIT_への戻りをトリガーされていません.TIMEOUT入力パラメータにエラーが発生するとWAIT_に戻りますFAILED
CloseHandle(semaphore);
Release(semaphore, 1, NULL);
1番目のパラメータ:セキュリティ属性、NULLの場合はデフォルトセキュリティ属性2番目のパラメータ:信号量の初期値、>=0、<=3番目のパラメータ3番目のパラメータ:信号量の最大値4番目のパラメータ:信号量の名前の戻り値:作成した信号量と既存の信号量の重複など、信号量のハンドルを指す既存の信号量ハンドルを返します
4.socket
/*Client*/
#include
#include
#pragma comment(lib, "ws2_32.lib")

void main()
{
	WSADATA wsaData;
	SOCKET sockClient;
	SOCKADDR_IN addrServer;
	
	if(0 != WSAStartup(MAKEWORD(2,2), &wsaData))
	{
		printf("       !");
		return;
	}
	
	sockClient = socket(AF_INET, SOCK_STREAM, 0);
	if(SOCKET_ERROR == sockClient)
	{
		printf("       !");
		return;
	}
	addrServer.sin_family = AF_INET;
	addrServer.sin_port = htons(6000);
	addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	
	if(INVALID_SOCKET == connect(sockClient, (SOCKADDR*)&addrServer, sizeof(addrServer))
	{
		printf("       !");
		return;
	}
	char message[20] = "hello world!";
	send(sockClient, message, strlen(sessage) + 1, 0);
	closesocket(sockClient);
	WSACleanup();
}
/*Server*/
#include
#include
#pragma comment(lib,"ws2_32.lib")
void main()
{
WSADATA wsaData;
SOCKET sockServer;
SOCKADDR_IN addrServer;
SOCKET sockClient;
SOCKADDR_IN addrClient;
WSAStartup(MAKEWORD(2,2),&wsaData);
sockServer=socket(AF_INET,SOCK_STREAM,0);
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//INADDR_ANY    IP
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000);//    6000
bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCKADDR));
 
//Listen   
listen(sockServer,5);//5       
printf("      :
...
"); int len=sizeof(SOCKADDR); char sendBuf[100];// char recvBuf[100];// // , sockClient=accept(sockServer,(SOCKADDR*)&addrClient,&len); // recv(sockClient,recvBuf,100,0); printf("%s
",recvBuf); // socket closesocket(sockClient); WSACleanup(); }

5.memcpy
memcpy(void * dst, const void * src, size_t size)
データコピーは、よく使われますが、srcやdstが構造体であれば、オフセットするときは必ず先に(char*)に回してください.そうしないと、1つ1つの構造体でオフセットします.コピーしたデータが重なってsrcが前にある場合は、memmoveを使って、データを失わないようにしてください.
6.ファイルの読み込み
C言語を採用した標準ライブラリ関数
char * temp = NULL;
char * value = NULL;
int iValue = 0;
FILE *fp = fopen("xxx", "r");
while(fgets(line, 100, fp) != NULL)
{
    if(line[0] == 'x')
    {
        temp = strtok(line, "x");
        value= strtok(NULL, ",");
        iValue = (int)strtol(value, NULL, 16);
    }
}
fclose(fp);